Подтвердить что ты не робот

Отображение типа CLR типа EDM неоднозначно с EF 6 и 5?

Пожалуйста, кто-нибудь может помочь мне исправить эту ошибку?

Указанная схема недействительна. Ошибки:

Отображение типа CLR типа EDM неоднозначно, поскольку несколько типов CLR соответствуют типу EDM 'City_DAL'. Ранее найденный тип CLR "CeossDAL.City_DAL", новый тип CLR "CeossBLL.City_DAL".

Основная проблема, что у меня есть DAL, и это содержит EF и BLL, и это содержит те же классы DAL, но отличается в пространстве имен, и именно это вызывает проблему

Я не знаю, как избавиться от этой проблемы, можете ли вы мне помочь?

Также я буду признателен, если кто-нибудь даст мне образец для использования n-уровневой архитектуры с EF

Спасибо

4b9b3361

Ответ 1

Не используйте классы с тем же самым неквалифицированным именем. EF использует только имена классов для идентификации типа, отображаемого в EDMX (пространства имен игнорируются) - это соглашение, позволяющее отображать классы из разных пространств имен в одну модель. Решение вашей проблемы состоит в том, чтобы по-разному назвать ваши классы в BLL.

Ответ 2

Временное решение: измените свойство на одном из двух одинаковых классов.

EF соответствует свойствам класса и класса. Поэтому я просто изменил имя свойства на одном из объектов EF, и ошибка исчезла.

Как @Entrodus прокомментировал один из других ответов:

EF-столкновение происходит только тогда, когда два класса имеют одно и то же имя. тот же набор параметров.

Ответ 3

Этот вопрос может быть полезен. Это предполагает размещение классов BLL и DAL в отдельных сборках.

Ответ 4

Для EF 6.x я нашел несколько заметок по адресу https://github.com/aspnet/EntityFramework/issues/941 и исправил это в своем решении, добавив аннотацию к типу EDM.

Я отредактировал файл EDMX вручную и изменил строку следующим образом:

<EntityType Name="CartItem">

к этому:

<EntityType Name="CartItem" customannotation:ClrType="EntityModel.CartItem">

или используйте это, если у вас есть существующий тип в другом месте:

<EntityType Name="CartItem" customannotation:ClrType="MyApp.CartItem, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">

где EntityModel - это пространство имен, используемое для моей модели EF, а MyApp - это пространство имен бизнес-объекта.

Ответ 5

В некоторых случаях это скорее симптом, чем реальная проблема. Для меня он обычно появляется, когда я пытаюсь вызвать функцию внутри запроса Linq, не вызывая сначала .ToList().

например. ошибка, которая привела меня сюда, была вызвана тем, что я сделал это:

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

Мне пришлось вызвать .ToList(), затем перебрать каждый элемент и присвоить ему тип.

Ответ 6

Возможно, это не было доступно, когда был задан вопрос, но другое решение - удалить EDMX и воссоздать его как модель данных сущности кода. В EF6 с кодовым первым вы можете сопоставить два класса с тем же именем из разных пространств имен моделей, не создавая конфликта.

Чтобы создать модель данных сущности в Visual Studio (2013), перейдите в "Добавить" > "Новый элемент..." > "Модель данных сущности ADO.NET". Обязательно выберите опцию "Первый код из базы данных".

Ответ 7

Другая причина, по которой вы можете получить эту ошибку: Если вы загружаете пользовательские сборки с помощью Assembly.LoadFile с файлами edmx, которые уже загружены в память. Это создает повторяющиеся классы, которым не нужна структура фреймов.

Ответ 8

Я получил ошибку выше, потому что для обеих строк подключения у меня было одинаковое значение для метаданных, указанное в моем основном файле конфигурации проекта, как показано ниже:

<add name="EntitiesA" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

<add name="EntitiesB" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

В итоге я скопировал правильную строку подключения из файла конфигурации проекта EntitiesB.

Ответ 9

Для меня это было потому, что я пытался получить доступ к типу с тем же именем в неправильном экземпляре контекста.

Скажем, у ContextA и ContextB есть SomeType. Я пытался получить доступ к ContextA.SomeType на экземпляре ContextB.

Ответ 10

Просто добавьте EntityFramework как "Сначала код из базы данных", а не как "EF Designer from database". Это решило мою проблему, но у него есть и темная сторона: если вы меняете базу данных, вам нужно удалить все классы и добавить ее снова, или просто отредактировать классы, я использую последний, когда меняю свойства столбцов, например "Разрешить". null "или размер строки. Но если вы добавляете столбцы, я рекомендую удалить и снова добавить классы.

Ответ 11

Мне удалось решить эту проблему без переименования классов, свойств или метаданных.

У меня была настройка проекта с преобразованием T4, создающим объекты-сущности в проекте DAL, и преобразованием T4, создающим объекты домена в проекте Domain, и оба ссылались на EDMX для создания идентичных объектов, а затем я отображал объекты DAL на объекты Domain.,

Ошибка произошла только тогда, когда я ссылался на другие классы (перечисления в моем случае) из сборки Домена в моих запросах. Когда я их убрал, ошибка ушла. Похоже, что EF загружал мою сборку домена из-за этого, видел другие классы с одинаковыми именами и взрывался.

Чтобы решить эту проблему, я сделал отдельную сборку, которая содержала только мои преобразованные классы домена T4. Поскольку мне никогда не нужно использовать их внутри запроса (только после запроса для сопоставления), у меня больше нет этой проблемы. Это кажется чище и проще, чем ответы ниже.

Ответ 12

если у вас есть 2 строки подключения в веб-конфигурации, но вы хотите использовать одну строку подключения, вы используете динамическое создание строки подключения для других объектов. У меня есть edmx (сначала db), и сначала кодируем сущности в моем решении. Я использую этот класс в коде первых лиц.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity.Core.EntityClient;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Data
{
    public class SingleConnection
    {
        private SingleConnection() { }
        private static SingleConnection _ConsString = null;
        private String _String = null;

        public static string ConString
        {
            get
            {
                if (_ConsString == null)
                {
                    _ConsString = new SingleConnection { _String = SingleConnection.Connect() };
                    return _ConsString._String;
                }
                else
                    return _ConsString._String;
            }
        }

        public static string Connect()
        {
            string conString = ConfigurationManager.ConnectionStrings["YourConnectionStringsName"].ConnectionString;

            if (conString.ToLower().StartsWith("metadata="))
            {
                System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder efBuilder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(conString);
                conString = efBuilder.ProviderConnectionString;
            }

            SqlConnectionStringBuilder cns = new SqlConnectionStringBuilder(conString);
            string dataSource = cns.DataSource;
            SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
            {
                DataSource = cns.DataSource, // Server name
                InitialCatalog = cns.InitialCatalog,  //Database
                UserID = cns.UserID,         //Username
                Password = cns.Password,  //Password,
                MultipleActiveResultSets = true,
                ApplicationName = "EntityFramework",

            };
            //Build an Entity Framework connection string
            EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
            {
                Provider = "System.Data.SqlClient",
                Metadata = "res://*",
                ProviderConnectionString = sqlString.ToString()
            };
            return entityString.ConnectionString;
        }
    }
}

И когда я звоню юридическим лицам

private static DBEntities context
{
get
{
    if (_context == null)
        _context = new DBEntities(SingleConnection.ConString);

    return _context;

}
set { _context = value; }
}

Ответ 13

Я думаю, что у вас есть класс X с именем "MyClass" в моделях объектов, а другой класс с именем "MyClass" в том же WorkFolder или Extended первого класса. Это моя проблема, и я исправляю ее.

Ответ 14

Существует библиотека под названием AutoMapper, которую вы можете скачать. Это помогает вам определять сопоставления классов из одного типа в другой.

Mapper.CreateMap<Model.FileHistoryEFModel, DataTypes.FileHistory>();
Mapper.CreateMap<DataTypes.FileHistory, Model.FileHistoryEFModel>();