在实体框架更新现有EntityCollection

我试图解决EF问题在我的实体来更新的集合:

[TestMethod] public void DeveEditarUsuarioNoRepositorio() { Usuario usuario = _usuarioRepository.GetById(1); usuario.Nome = "Samla Peidorreira"; usuario.Email = "[email protected]"; usuario.DataNascimento = new DateTime(1988, 11, 19, 4, 23, 54, 0); usuario.Sexo = (Sexo)Convert.ToByte(Sexo.Masculino); usuario.Telefone = null; usuario.Credencial.Status = (Status)Convert.ToByte(Status.Ativo); //That's the collection I want to update usuario.Credencial.Perfis = new List<Perfil>() { new Perfil() { Nome = "Fotografos", DataEdicao = new DateTime(1996, 2, 1, 12, 15, 42, 27), Deletado = true, Status = false, Tipo = 3 } }; usuario.Credencial.NomeUsuario = "samlapeidanascalca"; usuario.Credencial.Senha = "samlacagona"; _usuarioRepository.Edit(usuario); _context.SaveChanges(); Usuario usuarioEditado = _usuarioRepository.GetById(1); Assert.AreEqual("Samla Peidorreira", usuarioEditado.Nome); Assert.AreEqual("[email protected]", usuarioEditado.Email); Assert.AreEqual(new DateTime(1988, 11, 19, 4, 23, 54, 0), usuarioEditado.DataNascimento); Assert.AreEqual(Sexo.Masculino, usuarioEditado.Sexo); Assert.AreEqual(null, usuarioEditado.Telefone); Assert.AreEqual(Status.Ativo, usuarioEditado.Credencial.Status); Assert.AreEqual(1, usuarioEditado.Credencial.Perfis.Count); Assert.AreEqual(5, usuarioEditado.Credencial.Perfis[0].Id); Assert.AreEqual("samlapeidanascalca", usuarioEditado.Credencial.NomeUsuario); Assert.AreEqual("samlacagona", usuarioEditado.Credencial.Senha); }

发生什么事是,当我设置Perfis地产新列表,它不能代替财产的价值,将它添加在该财产的实际列表新名单的值。WTF这是为什么发生的呢?

我做什么来解决这个是我的实体这样做:

public class Credencial : Entity { private IList<Perfil> _perfis; public Credencial() { Status = Status.Inativo; } public virtual Usuario Usuario { get; set; } public virtual IList<Perfil> Perfis { get { return _perfis ?? (_perfis = new List<Perfil>()); } set { Perfis.Clear(); _perfis = value; } } public virtual Status Status { get; set; } public byte StatusId { get { return (byte)Status; } set { Status = (Status)value; } } public string NomeUsuario { get; set; } public string Senha { get; set; } }

看看我的集合{}在 Perfis属性。 这样做,即使我想设置的Perfis属性,则清除列表,并与新的Itens添加新的列表。

我做错了什么? 没有人谈论这个解决方案。

--------------解决方案-------------

好。 现在我明白你的问题。 我还以为你要更新的关系,而且要取代他们,仍然保留旧的对象。 我希望UsuarioPerfil在许多一对多的关系,不是吗?

如果你只更换列表中的旧值仍然存在。 EF不会做任何事情将其删除,因为更换收集deoesn't影响他们,但如果改为调用明确名单上删除当前关系Usuario和所有加载Perfil (它会在删除结表中的记录SaveChanges )。

我认为你不应该清除实体的制定者名单。 甚至不应该允许改变集合。 你应该叫清在您的测试逻辑,然后添加一个新的Perfil

usuario.Credencial.Perfis.Clear();
usuario.Credencial.Perfis.Add(new Perfil { ... });

其原因是,EF有时,如果你操作的集合导航性能,它激发了初始化集合不能分配例外不喜欢。

分类:。净 时间:2015-03-15 人气:1
本文关键词: .NET,实体框架,库
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.851 (s). 10 q(s)