2011-08-29 54 views
0

我使用EF 4.1和我在一个仓库编辑方法:实体的行为是非常奇怪的

public virtual void Edit(TEntity entity) 
{ 
    this.DbContext.Entry(entity).State = EntityState.Modified; 
} 

这种方法不更新自己的集合体,我有这样的实体:

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 = 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属性是这样的:

[TestMethod] 
public void DeveEditarUsuarioNoRepositorio() 
{ 
    Usuario usuario = _usuarioRepository.GetById(1); 

    usuario.Credencial.Perfis = null; 

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

    //Here I want to replace Perfis, but it only add one more 
    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); 
} 

什么发生的是存储库在我的实体中再添加一个Perfil。我不想再添加一个,我想替换。

更新:

我发现了同样的问题一个问题:Update method for generic Entity framework repository

回答

0

设置实体的状态对关系的状态没有影响。如果要替换Perfil中的数据,则必须单独处理并设置其正确状态。它是a feature(这是关于ObjectContext API的,但对于DbContext API也是如此)。

+0

OMG,你确定吗?为什么EF与我一起做?你不认为EF是以错误的方式实施的? –

+0

我很确定。一旦你使用分离的实体,你必须手动设置每个实体或关系的状态,一旦你将它们连接到上下文。 –