O mapeamento do tipo CLR para o tipo EDM é ambíguo com o EF 6 & 5?

Por favor, qualquer um pode me ajudar a corrigir esse erro?

Esquema especificado não é válido. Erros:

O mapeamento do tipo CLR para o tipo EDM é ambíguo porque vários tipos de CLR correspondem ao tipo de EDM ‘City_DAL’. Anteriormente encontrado o tipo CLR ‘CeossDAL.City_DAL’, recém-encontrado tipo CLR ‘CeossBLL.City_DAL’.

O principal problema que eu tenho DAL e este contém o EF e BLL e este contém as mesmas classs do DAL, mas diferem no espaço de nomes e é isso que causa o problema

Eu não sei como me livrar desses problemas, você pode me ajudar?

Também serei apreciado se alguém me der amostra para usar a arquitetura de n camadas com EF

Obrigado

Não use classs com o mesmo nome não qualificado – o EF usa apenas nomes de classs para identificar o tipo mapeado no EDMX (namespaces são ignorados) – é uma convenção para permitir o mapeamento de classs de namespaces diferentes para um único modelo. A solução para o seu problema é nomear suas classs na BLL de forma diferente.

Solução alternativa: altere uma propriedade em uma das duas classs idênticas.

A EF corresponde ao nome da class E às propriedades da class. Então eu apenas mudei um nome de propriedade em um dos objects EF, e o erro sumiu.

Como @Entrodus comentou sobre uma das outras respostas:

A colisão EF ocorre apenas quando duas classs têm o mesmo nome e o mesmo conjunto de parâmetros.

Esta questão do fórum da MSDN pode ser útil. Sugere colocar as classs BLL e DAL em montagens separadas.

Para o EF 6.x, encontrei algumas notas em https://github.com/aspnet/EntityFramework/issues/941 e corrigi-as na minha solução adicionando annotations ao tipo EDM.

Eu editei o arquivo EDMX manualmente e mudei uma linha como esta:

 

para isso:

  

ou use isso se você tiver um tipo existente em outro lugar:

  

onde EntityModel é o namespace usado para o meu modelo EF e MyApp é o namespace de um object de negócios

Em alguns casos, isso é mais um sintoma do que o problema real. Para mim, geralmente aparece quando tento chamar uma function dentro de uma consulta Linq sem chamar .ToList () primeiro.

Por exemplo, o erro que me trouxe aqui foi causado porque eu fiz isso:

 var vehicles = DB.Vehicles.Select(x => new QuickSearchResult() { BodyText = x.Make + " " + x.Model + "
" + "VIN: " + x.VIN + "
" + "Reg: " + x.RegistrationNumber +"
" + x.AdditionalInfo type = QuickSearchResultType.Vehicle,//HERE. Can't use an enum in an IQueryable. UniqueId = x.VehicleID });

Eu tive que chamar .ToList (), em seguida, percorrer cada item e atribuir o tipo a ele.

Isso pode não estar disponível quando a pergunta foi feita, mas outra solução é excluir o EDMX e recriá-lo como um modelo de dados de entidade de primeiro código. No EF6, com code-first, você pode mapear duas classs com o mesmo nome de namespaces de modelo diferentes sem criar um conflito.

Para criar o modelo de dados de entidade no Visual Studio (2013), vá para “Adicionar”> “Novo Item …”> “Modelo de Dados de Entidade ADO.NET”. Certifique-se de escolher a opção “Código primeiro do database”.

Outro motivo que você pode obter esse erro: Se você estiver carregando assemblies personalizados com Assembly.LoadFile que possuem arquivos edmx, que já foram carregados na memory. Isso cria classs duplicadas que a estrutura de entidades não gosta.

Recebi o erro acima porque, para as duas sequências de conexão, eu tinha o mesmo valor para os metadados especificados no arquivo de configuração do meu projeto principal, como abaixo:

   

Acabei copiando a string de conexão correta do arquivo de configuração do projeto EntitiesB.

Para mim, isso aconteceu porque eu estava tentando acessar um tipo com o mesmo nome na instância de contexto incorreta.

Diga que ContextA e ContextB possuem SomeType . Eu estava tentando acessar ContextA.SomeType em uma instância de ContextB .

Basta adicionar EntityFramework como “Código primeiro do database” e não como “EF Designer do database”. Isso resolveu meu problema, mas tem um lado obscuro, se você alterar seu database você tem que remover todas as classs e adicioná-lo novamente, ou apenas editar as classs, eu uso o último quando altero propriedades das colunas, como “Permite null “ou o tamanho de uma string. Mas se você adicionar colunas eu recomendo remover e adicionar novamente as classs.

Existe uma biblioteca chamada AutoMapper, que você pode baixar. Ele ajuda você a definir mapeamentos de class de um tipo para outro.

 Mapper.CreateMap(); Mapper.CreateMap();