实体框架中的实体行为很奇怪

发布于 2024-12-02 02:09:49 字数 3131 浏览 0 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

往日情怀 2024-12-09 02:09:49

设置实体的状态对其关系的状态没有影响。如果您想替换 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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文