Asp.net 实体框架:关系错误

Asp.net 实体框架:关系错误,asp.net,entity-framework,Asp.net,Entity Framework,我试图优化我的网站的性能,所以我跟随 在编译时生成视图时,我必须创建.edmx文件,创建此文件后,遵循我面临的所有步骤: Schema specified is not valid. Errors: The property for the relationship 'FK_dbo_X_dbo_Y_x_id' contains a Role 'X' has a type 'Site.Models.X' that is not valid for a relationship End. Chan

我试图优化我的网站的性能,所以我跟随 在编译时生成视图时,我必须创建
.edmx
文件,创建此文件后,遵循我面临的所有步骤:

Schema specified is not valid. Errors: 
The property for the relationship 'FK_dbo_X_dbo_Y_x_id' contains a Role 'X' has a type 'Site.Models.X' that is not valid for a relationship End. Change the End Role to an EntityType.
我的每一个亲戚

有人能告诉我如何修复这个错误吗

更新:

我如何定义我的关系

在模型中:

    [ForeignKey("foreign_id")]
    public EntityCollection<MyClass> relation_obj { get; set; }

您的问题是,您将未映射到数据库的类(您自己定义的类)定义为导航属性类。不要这样做。实体框架无法使用此类导航属性。您可以阅读有关导航属性的更多信息

问题在于:

[assembly: EdmRelationshipAttribute("DBModel", "FK_dbo_X_dbo_Y_x_id", "X", System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Site.Models.X), "Y", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Site.Models.Y), true)]
从MSDN:

"

参数

关系名称空间名称 类型:System.String 此实体参与的关联的命名空间的名称

关系名称 类型:System.String 此实体参与的关系的名称

角色名称 类型:System.String 关联一端类型的角色名称

角色1多重性 类型:System.Data.Metadata.Edm.RelationshipMultiplicity RelationshipMultiplicity的值,指示关联一端的多重性,例如一个或多个

角色类型 类型:System.Type 关联一端的实体的类型

角色名称 类型:System.String 关联另一端类型的角色名称

角色2多重性 类型:System.Data.Metadata.Edm.RelationshipMultiplicity RelationshipMultiplicity的值,指示关联另一端的多重性,如一个或多个

角色2类型 类型:System.Type 关联另一端的实体的类型。 "


所以role1Type和role2Type应该是实体。不是您自己定义的类。

您的问题是,您将未映射到数据库的类(您自己定义的类)定义为导航属性类。不要这样做。实体框架无法使用此类导航属性。您可以阅读有关导航属性的更多信息

问题在于:

[assembly: EdmRelationshipAttribute("DBModel", "FK_dbo_X_dbo_Y_x_id", "X", System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Site.Models.X), "Y", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Site.Models.Y), true)]
从MSDN:

"

参数

关系名称空间名称 类型:System.String 此实体参与的关联的命名空间的名称

关系名称 类型:System.String 此实体参与的关系的名称

角色名称 类型:System.String 关联一端类型的角色名称

角色1多重性 类型:System.Data.Metadata.Edm.RelationshipMultiplicity RelationshipMultiplicity的值,指示关联一端的多重性,例如一个或多个

角色类型 类型:System.Type 关联一端的实体的类型

角色名称 类型:System.String 关联另一端类型的角色名称

角色2多重性 类型:System.Data.Metadata.Edm.RelationshipMultiplicity RelationshipMultiplicity的值,指示关联另一端的多重性,如一个或多个

角色2类型 类型:System.Type 关联另一端的实体的类型。 "


所以role1Type和role2Type应该是实体。不是你自己定义的类。

你能用你的优化显示代码吗?我添加了一个新的
edmx
文件,这样它会自动为我拥有的每个表创建新的模型,所以我删除了模型并修改了设计器和程序集引用以使用旧模型,如下所示:
[assembly:EdmRelationshipAttribute(“DBModel”,“FK_dbo_X_dbo_Y_restaurant_id”,“X”,System.Data.Metadata.Edm.RelationshipMultiplicity.One,typeof(Site.Models.X),“Y”,System.Data.Metadata.Edm.RelationshipMultiplicity.Many,typeof(restaurantap.Models.Y),true)]
并像他们在这里说的那样添加了预构建脚本:
http://msdn.microsoft.com/en-us/library/bb896240.aspx
KirillBestemyanov先生如果您需要任何其他信息,请告诉我,我们将非常感谢您的帮助!是Site.Models.X和Site.Models.Y EntityFramework生成的类还是您定义的类?我自己的classes,我以前使用的旧模型您能用您的优化显示代码吗?我添加了一个新的
edmx
文件,因此它会自动为我拥有的每个表创建新模型,因此我删除了模型并修改了设计器和程序集引用,以使用旧模型,如下所示:
[assembly:edmrationshipAttribute(“DBModel”)FK_dbo_X_dbo_Y_restaurant_id”,“X”,System.Data.Metadata.Edm.RelationshipMultiplicity.One,typeof(Site.Models.X),“Y”,System.Data.Metadata.Edm.RelationshipMultiplicity.Many,typeof(restaurantap.Models.Y),true)]
并像他们在这里说的那样添加了预构建脚本:
http://msdn.microsoft.com/en-us/library/bb896240.aspx
KirillBestemyanov先生如果您需要任何其他信息,请告诉我,我们将非常感谢您的帮助!是Site.Models.X和Site.Models.Y EntityFramework生成的类还是您定义的类?我自己的classes,我以前使用的旧模型先生,我想我没有很好地理解你的观点,我的导航器通过
DbContext
映射到数据库,如下所示:
modelBuilder.Entity().HasMany(m=>m.relation\u obj)
而且它以前就工作过。先生,我非常感谢您的帮助。非常感谢!这里是Site.Models.Y和Site.Models.X,它们不是EF类:[汇编:edmrationshipAttribute(“DBModel”,“FK_dbo_X_dbo_Y_X_id”,“X”,“System.Data.Metadata.Edm.RelationshipMultiplicity.One”,“typeof(Site.Models.X),“Y“,System.Data.Metadata.Edm.RelationshipMultiplicity.Many,typeof(Site.Models.Y),true)]先生,我想我没有收到您的poi
[assembly: EdmRelationshipAttribute("DBModel", "FK_dbo_X_dbo_Y_x_id", "X", System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Site.Models.X), "Y", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Site.Models.Y), true)]
public EdmRelationshipAttribute(
    string relationshipNamespaceName,
    string relationshipName,
    string role1Name,
    RelationshipMultiplicity role1Multiplicity,
    Type role1Type,
    string role2Name,
    RelationshipMultiplicity role2Multiplicity,
    Type role2Type
)