Pergunta

Eu tenho este teste na minha base de teste:

public void WorksWithAreaUsers()
        {
            using (new TransactionScope())
            {
                //arrange
                var userBusiness = new UserBusiness();
                var user = new User
                {
                    Name = "TestUser###",
                    Login = "domain\test-user###"
                };
                userBusiness.Add(user);

                var areaBusiness = new AreaBusiness();
                var area = new Area
                {
                    Name = "TestArea###",
                    Description = "Test Area Description",
                    Users = new List<User> { user }
                };

                //act
                areaBusiness.Add(area);

                //assert
                var areaFromDb = areaBusiness.FindById(area.AreaID);
                Assert.IsNotNull(areaFromDb.Users);
                Assert.IsTrue(areaFromDb.Users.Count > 0);
                Assert.IsTrue(areaFromDb.Users.Any(c => c.UserID == user.UserID));
            }
        }

O que ele está fazendo:

  • Insere um novo usuário para a base;
  • Insere uma nova área na base, com a relação de utilizador;

O que realmente acontece:

  • É inserido o novo usuário;
  • É inserido o novo espaço;
  • O novo utilizador é inserido de novo, com a relação de área;

O que pode estar acontecendo?

Mais informações:

  • Área e usuário não são EntityObjects realmente. Estou mapeando DTO / Entidade usando AutoMapper, eu acho que o problema é nessa lógica. Em um certo momento, eu tenho que mapear entre a lista e as EntityCollection. I criar uma nova EntityCollection e colocar o usuário convertido em um UserEntity nesta coleção, usando o método EntityCollection.Add. Eu acho que eu deveria usar Anexar, a fim de não criar uma nova entidade, mas este método não funciona quando chamado a partir de um EntityCollection sem as ligações adequadas.

Você sugere alguma coisa inteligente do que isso, ou qualquer solução para resolver este problema? Eu realmente preciso das camadas de projeto (Web -> Negócios -> Data -> EF), asp.net trabalhando diretamente com a EF é algo que não podemos fazer aqui, por razões de modularidade

.

Editar :

Eu estou desistindo da idéia de usar AutoMapper para fazer este trabalho = / Eu não tenho um monte de entidades, e as mudanças que eu preciso fazer nesta biblioteca, a fim de trabalho exige algum esforço, ele isn' t algo simples de se fazer. É melhor fazer o mapeamento por mim.

Foi útil?

Solução

Eu assumo o seu objeto de usuário tem uma propriedade da área, que também pode ser usado para estabelecer a relação entre as entidades. Em vez de definir Area.Users igual a uma nova lista, Depois de criar o objeto de área de apenas definir User.Area igual à nova área. Isto é como eu lido com associando novas entidades e funciona de forma confiável.

Editar

Se eu entendo o que você está fazendo, você está criando objetos de negócios (BOS), que mais tarde criar objetos de entidade (EO) e anexar esses OE para um contexto e guardá-las.

Supondo que eu tenho o básico correto, determing a causa exata do que você problema requer vendo o código para a forma como os respectivos BOs criar OE e anexá-las ao contexto.

Outras dicas

Meu palpite (e é apenas uma suposição) é que AutoMapper não está fazendo resolução de identidade

Assim, quando se vê o mesmo objeto (usuário) em lugares diferentes no gráfico que cria um novo objeto, em vez de re-utilizando o objeto que criou anteriormente.

Este seria provavelmente explicar o que você está vendo.

Alex

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top