Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CLR类型到EDM类型的映射与EF 6&;5._C#_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# CLR类型到EDM类型的映射与EF 6&;5.

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层体系结构的示例,我将不胜感激 谢谢不要使用具有相同非

请问有人能帮我修复这个错误吗

指定的架构无效。错误:

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=&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项目的配置文件复制了正确的连接字符串。

对我来说,这是因为我试图在错误的上下文实例上访问同名的类型


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