2011-08-29 53 views
1

我試圖解決EF問題來更新我的實體的集合:更新現有EntityCollection

[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爲什麼會發生這種情況?

我做些什麼來解決,這是在我的實體這樣做:在我集合{} IN Perfis物業

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; } 
} 

LOOK。這樣做,即使我想設置Perfis屬性,它將清除列表並添加新Itens的新列表。

我做錯了什麼?沒有人談論這個解決方案。

+0

你的問題的要點是什麼?清算清單將如何幫助解決您的問題? –

+0

@Ladislav在我發送一個新對象之前,它只添加這個對象的項目。現在它清除列表並添加。 –

+0

它應該怎麼做?它完全按照你的指示去做。 –

回答

6

好的。現在我明白你的問題了。我以爲你想更新關係,但你想替換它們,仍然保留舊的對象。我預計UsuarioPerfil是多對多關係,不是嗎?

如果只替換列表,舊值仍然存在。 EF將不做任何刪除操作,因爲替換集合並不會影響它們,但是如果您改爲調用列表中的清除,則會刪除當前的Usuario與所有加載的Perfil(它將在SaveChanges期間從聯結表中刪除記錄)之間的關係。

我認爲你不應該清除實體的setter中的列表。你甚至不應該允許改變收藏。你應該叫清在您的測試邏輯,然後添加一個新的Perfil

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

的原因是,EF有時,如果你操作的集合的導航性能,它可以觸發該初始化集合不能分配例外不喜歡。

+0

這個例子我正在更新列表中的現有項目。我不想要這個。我想要的是用新的ITENS新列表替換我的列表。先前列表中的itens將繼續存在。 –

+0

我編輯了我的答案。 –

+0

是的,這是我做的。我甚至在該屬性中設置一個新對象之前清除列表,看看我的SET,你的想法是什麼? –