Обновите существующую коллекцию EntityCollection в Entity Framework - PullRequest
1 голос
/ 30 августа 2011

Я пытаюсь решить проблему в EF, чтобы обновить коллекцию в моей сущности:

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

    usuario.Nome = "Samla Peidorreira";
    usuario.Email = "samlapeidanascalca@samlapeidanascalca.com";
    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("samlapeidanascalca@samlapeidanascalca.com", 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; }
}

СМОТРИ НА МОЙ SET {} IN Perfis Свойство. Делая это, даже когда я хочу установить свойство Perfis, он очистит список и добавит новый список с новыми Itens.

Я что-то не так делаю? Никто не говорит об этом решении.

1 Ответ

6 голосов
/ 30 августа 2011

Хорошо. Теперь я понимаю вашу проблему. Я думал, что вы хотите обновить отношения, но вы хотите заменить их и сохранить старые объекты. Я ожидаю, что Usuario и Perfil связаны между собой, не так ли?

Если заменить только список, старые значения все еще существуют. EF ничего не сделает для их удаления, потому что замена deoes коллекции не влияет на них, но если вы вместо этого вызовете clear в списке, он удалит отношения между текущим Usuario и всеми загруженными Perfil (он удалит записи из соединительной таблицы во время SaveChanges).

Я думаю, что вы не должны очищать список в установщике сущности. Вы даже не должны позволять менять коллекцию. Вы должны вызвать clear в своей тестовой логике, а затем добавить новый Perfil:

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

Причина в том, что EF иногда не нравится, если вы манипулируете коллекциями для свойств навигации, и он генерирует исключения, которые нельзя назначить инициализированной коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...