实体框架中的实体行为很奇怪
我正在使用 EF 4.1,并且存储库中有一个 Edit 方法:
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 。我不想再添加一个,我想更换。
更新:
我发现了一个具有同样问题的问题:更新通用实体框架存储库的方法
I'm using EF 4.1 and I have a Edit method in repository:
public virtual void Edit(TEntity entity)
{
this.DbContext.Entry(entity).State = EntityState.Modified;
}
This method don't update my aggregates, I have this entity:
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; }
}
I'm trying to update Perfis property like this:
[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);
}
What happen is the repository add one more Perfil in my entity. I don't want to add one more, I want to replace.
Update:
I found a question with same problem: Update method for generic Entity framework repository
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
设置实体的状态对其关系的状态没有影响。如果您想替换
Perfil
中的数据,您必须单独处理它并设置其正确的状态。这是一项功能(它关于 ObjectContext API,但 DbContext API 也是如此,甚至更糟)。Setting state of the entity has no effect on the state of its relations. If you want to replace data in
Perfil
you must handle it separately and set its correct state. It is a feature (it is about ObjectContext API but the same is true or worse with DbContext API).