请有人帮我解决此错误吗?
指定的架构无效。错误:
CLR类型到EDM类型的映射是不明确的,因为多个CLR类型与EDM类型“City_DAL”匹配。以前发现CLR类型'CeossDAL.City_DAL',新发现的CLR类型'CeossBLL.City_DAL'。
我有DAL的主要问题,它包含EF和BLL,它包含相同的DAL类但名称空间不同,这就是导致问题的原因
我不知道怎么摆脱这些问题,能帮帮我吗?
如果有人给我示例使用带有EF
的n层架构,我将不胜感激谢谢
答案 0 :(得分:75)
不要使用具有相同非限定名称的类 - EF仅使用类名来标识EDMX中映射的类型(名称空间被忽略) - 允许从不同名称空间映射类的约定单一模型。您的问题的解决方案是以不同的方式命名您的BLL类。
答案 1 :(得分:37)
解决方法:更改两个相同类别之一的属性。
EF匹配类名和类属性。所以我只更改了其中一个EF对象的属性名称,错误消失了。
正如@Entrodus评论其他一个答案:
只有当两个类具有相同的名称时才会发生EF碰撞 相同的参数集。
答案 2 :(得分:10)
This MSDN论坛问题可能会有所帮助。它建议将BLL和DAL类放在单独的程序集中。
答案 3 :(得分:5)
在某些情况下,这更像是一个症状,而不是实际问题。对我来说,当我尝试在Linq查询中调用函数而不首先调用.ToList()时,它通常会弹出。
E.g。我带来的错误是因为我这样做了:
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(),然后遍历每个项目并为其分配类型。
答案 4 :(得分:5)
对于EF 6.x,我在https://github.com/aspnet/EntityFramework/issues/941找到了一些注释,并通过在EDM类型中添加注释来解决这个问题。
我手动编辑了EDMX文件并更改了这样一行:
k
到此:
<EntityType Name="CartItem">
或如果您在其他地方有现有类型,请使用此选项:
<EntityType Name="CartItem" customannotation:ClrType="EntityModel.CartItem">
其中 EntityModel 是用于我的EF模型的命名空间, MyApp 是业务对象的命名空间
答案 5 :(得分:1)
当提出问题时,这可能不可用,但另一种解决方案是删除EDMX并将其重新创建为代码优先的实体数据模型。在EF6中,使用代码优先,您可以映射来自不同模型名称空间的两个具有相同名称的类,而不会产生冲突。
要在Visual Studio(2013)中创建实体数据模型,请转到“添加”&gt; “New Item ...”&gt; “ADO.NET实体数据模型”。请务必选择“数据库中的代码优先”选项。
答案 6 :(得分:0)
您可能会收到此错误的另一个原因: 如果您正在使用具有edmx文件的Assembly.LoadFile加载自定义程序集,那么这些文件已经加载到内存中。这会创建实体框架不喜欢的重复类。
答案 7 :(得分:0)
我得到了上面的错误,因为对于两个连接字符串,我在主项目的配置文件中指定的元数据具有相同的值,如下所示:
<add name="EntitiesA" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string="data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
我最终从EntitiesB项目的配置文件中复制了正确的连接字符串。
答案 8 :(得分:0)
对我来说,这是因为我试图在错误的上下文实例上访问具有相同名称的类型。
同时说ContextA
和ContextB
都有SomeType
。我试图在ContextA.SomeType
的实例上访问ContextB
。
答案 9 :(得分:0)
只需将EntityFramework添加为“来自数据库的代码优先”,而不添加为“来自数据库的EF设计器”。这解决了我的问题,但是有一个阴暗面,如果您更改数据库,则必须删除所有类并再次添加它,或者只是编辑类,当更改列的属性时,我会使用最后一个,例如“允许null”或字符串的大小。但是,如果您添加列,建议删除并再次添加类。
答案 10 :(得分:0)
我能够解决此问题,而无需重命名类,属性或元数据。
我在项目设置中进行了T4转换,在DAL项目中创建了实体对象,并进行了T4转换,在Domain项目中创建了域对象,都引用EDMX来生成相同的对象,然后将DAL对象映射到域对象。
仅当我在查询中从Domain程序集引用其他类(在我的情况下为枚举)时,才发生错误。当我删除它们时,错误消失了。因此,EF似乎正在加载我的Domain程序集,看到其他同名的类,然后崩溃。
为解决此问题,我制作了一个单独的程序集,其中仅包含T4转换的Domain类。由于我不再需要在查询中使用这些内容(仅在要映射到的查询之后),因此不再有此问题。这似乎比下面的答案更干净,更容易。
答案 11 :(得分:0)
如果您的Web配置中有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; }
}
答案 12 :(得分:0)
我觉得u必须在实体模型一类X名为“MyClass的”和另一类称为“MyClass的”在相同的WorkFolder或扩展所述第一类的。 那是我的问题,我解决了。
答案 13 :(得分:0)
我发现使用自定义注释解决方案适用于 EF 6.2.0。只需确保在 ConceptualModels 节点中进行更改并为类型使用完整的命名空间。
<edmx:ConceptualModels>
<Schema Namespace="Sample.Access.Data.Ef" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="DbTableName" customannotation:ClrType="Sample.Access.Data.Ef.DbTableName, Sample.Access.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<Key>
<PropertyRef Name="DbTableNameId" />
</Key>
<Property Name="DbTableNameId" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="OptionName" Type="String" MaxLength="100" FixedLength="false" Unicode="false" Nullable="false" />
<Property Name="Value" Type="String" MaxLength="500" FixedLength="false" Unicode="false" Nullable="false" />
<Property Name="UpdatedDate" Type="DateTime" Nullable="false" Precision="3" />
</EntityType>
<EntityContainer Name="MyEntities" annotation:LazyLoadingEnabled="true" customannotation:UseClrTypes="true">
<EntitySet Name="DbTableNames" EntityType="Self.DbTableName" />
</EntityContainer>
</Schema>
</edmx:ConceptualModels>
答案 14 :(得分:-9)
您可以下载一个名为AutoMapper的库。它可以帮助您定义从一种类型到另一种类型的类映射。
Mapper.CreateMap<Model.FileHistoryEFModel, DataTypes.FileHistory>();
Mapper.CreateMap<DataTypes.FileHistory, Model.FileHistoryEFModel>();