C# CLR类型到EDM类型的映射与EF 6&;5.
请问有人能帮我修复这个错误吗 指定的架构无效。错误: CLR类型到EDM类型的映射不明确,因为多个CLR类型与EDM类型“City_DAL”匹配。以前发现的CLR类型为“CeossDAL.City\u DAL”,新发现的CLR类型为“CeossBLL.City\u DAL” 我有DAL的主要问题,它包含EF和BLL,它包含DAL的相同类,但名称空间不同,这就是问题的原因 我不知道如何解决这些问题,你能帮我吗 另外,如果有人给我一个使用EF的n层体系结构的示例,我将不胜感激C# CLR类型到EDM类型的映射与EF 6&;5.,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,请问有人能帮我修复这个错误吗 指定的架构无效。错误: CLR类型到EDM类型的映射不明确,因为多个CLR类型与EDM类型“City_DAL”匹配。以前发现的CLR类型为“CeossDAL.City\u DAL”,新发现的CLR类型为“CeossBLL.City\u DAL” 我有DAL的主要问题,它包含EF和BLL,它包含DAL的相同类,但名称空间不同,这就是问题的原因 我不知道如何解决这些问题,你能帮我吗 另外,如果有人给我一个使用EF的n层体系结构的示例,我将不胜感激 谢谢不要使用具有相同非
谢谢不要使用具有相同非限定名称的类-EF仅使用类名来标识在EDMX中映射的类型(忽略名称空间)-这是一种允许将不同名称空间中的类映射到单个模型的约定。您的问题的解决方案是以不同的方式在BLL中命名您的类。MSDN论坛问题可能会有所帮助。建议将BLL和DAL类放在单独的程序集中。有一个名为AutoMapper的库,您可以下载它。它帮助您定义从一种类型到另一种类型的类映射
Mapper.CreateMap<Model.FileHistoryEFModel, DataTypes.FileHistory>();
Mapper.CreateMap<DataTypes.FileHistory, Model.FileHistoryEFModel>();
Mapper.CreateMap();
CreateMap();
解决方法:更改两个相同类之一的属性。
EF在类名和类属性上匹配。所以我只是在一个EF对象上更改了一个属性名,错误就消失了
正如@Entrodus对另一个答案的评论:
只有当两个类具有相同的名称和 同一组参数
当提出问题时,这可能不可用,但另一种解决方案是删除EDMX并将其重新创建为代码优先实体数据模型。在EF6中,使用代码优先,您可以从不同的模型名称空间映射两个具有相同名称的类,而不会产生冲突
要在Visual Studio(2013)中创建实体数据模型,请转到“添加”>“新建项…”>“ADO.NET实体数据模型”。请务必选择“先从数据库编码”选项。在某些情况下,这更像是一种症状,而不是实际问题。对我来说,当我尝试在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
});
var vehicles=DB.vehicles.Select(x=>newQuickSearchResult()
{
BodyText=x.Make+“”+x.Model+“
”
+“VIN:+x.VIN+”
”
+“注册号:+x.RegistrationNumber+”
”
+x.附加信息
type=QuickSearchResultType.Vehicle,//此处。无法在iQueryTable中使用枚举。
UniqueId=x.VehicleID
});
我必须调用.ToList(),然后遍历每个项目并为其分配类型。对于EF 6.x,我在上找到了一些注释,并通过向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是业务对象的名称空间可能出现此错误的另一个原因:
如果使用Assembly.LoadFile加载的自定义程序集包含edmx文件,这些文件已加载到内存中。这会创建实体框架不喜欢的重复类。我出现上述错误,因为对于两个连接字符串,我在主项目的配置文件中指定的元数据值相同,如下所示:
<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项目的配置文件复制了正确的连接字符串。对我来说,这是因为我试图在错误的上下文实例上访问同名的类型
说
ContextA
和ContextB
都有SomeType
。我试图访问ContextA.SomeType
的ContextB
实例,只需将EntityFramework添加为“数据库中的代码优先”,而不是“数据库中的EF设计器”。这解决了我的问题,但它有一个阴暗面,如果您更改数据库,您必须删除所有类并再次添加,或者只是编辑类,我在更改列的属性时使用最后一个,如“允许null”或字符串的大小。但是如果您添加列,我建议您删除并再次添加类。我能够解决这个问题,而无需重命名类、属性或元数据
我在项目设置中使用T4变换在DAL项目中创建实体对象,使用T4变换在域项目中创建域对象,两者都引用EDMX生成相同的对象,然后我将DAL对象映射到域对象
仅当我在查询中引用域程序集中的其他类(本例中为枚举)时,才会发生此错误。当我删除它们时,错误消失了。看起来EF加载我的域程序集就是因为这个,看到其他同名的类,然后爆炸了
为了解决这个问题,我制作了一个单独的程序集,其中只包含我的T4转换域类。因为我永远不需要在查询中使用它们(仅在要映射到的查询之后),所以我不再有这个问题。这似乎比下面的答案更清晰、更简单。如果您在web配置中有两个连接字符串,但希望使用一个连接字符串 您可以使用动态创建连接字符串来创建其他实体。 我的解决方案中有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; }
}
我认为在实体模型中有一个名为“MyClass”的类X,在同一个工作文件夹或第一个类的扩展中有另一个名为“MyClass”的类。 这是我的问题,我会解决它。如果我命名为t