Asp.net mvc 如何使代码优先实体框架4.3多对多表具有附加列?
在MVC3的实体框架4.3代码优先模型中,我有以下类:Asp.net mvc 如何使代码优先实体框架4.3多对多表具有附加列?,asp.net-mvc,asp.net-mvc-3,entity-framework,entity-framework-4,many-to-many,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,Entity Framework 4,Many To Many,在MVC3的实体框架4.3代码优先模型中,我有以下类: public class Film { public Int32 ID { get; set; } [Column("FilmName"), MinLength(2), MaxLength(100)] [Required(ErrorMessage = "Please enter a name")] public String Name { get; set; } public Model.Cast
public class Film
{
public Int32 ID { get; set; }
[Column("FilmName"), MinLength(2), MaxLength(100)]
[Required(ErrorMessage = "Please enter a name")]
public String Name { get; set; }
public Model.Cast Cast { get; set; }
}
public class Actor
{
public Int32 ID { get; set; }
[MaxLength(75)]
public String Name { get; set; }
}
[Table("Cast")]
public class Cast
{
public Actor Actor { get; set; }
[MaxLength(500)]
public String Role { get; set; }
public virtual Film Film { get; set; }
}
我想要一个如下所示的表格布局:
Films:
ID PK
Name
Cast:
FilmID PK FK
ActorID PK FK
Role
Actors:
ID PK
Name
如何创建演员表?我现在得到以下错误:
##System.Data.Entity.Edm.EdmEntityType::EntityType“Cast”未定义键。定义此EntityType的键\tSystem.Data.Entity.Edm.EdmEntitySet:EntityType:EntitySet“强制转换”基于未定义键的类型“强制转换”##
但是我不想创建ID键,我想使用Film和Actor的ID字段来创建一个复合主键,这两个都是其他表的外键
我该怎么办?我以前试过这样做,但没有成功。我的解决方案是将链接表像普通实体一样映射到它自己的标识PK,并自定义DatabaseInitializer以运行DDL脚本来为FK创建唯一索引。我猜EF的设计不支持这种遗留映射。您必须以这种方式重新定义您的模型:
public class Film
{
public Int32 ID { get; set; }
[Column("FilmName"), MinLength(2), MaxLength(100)]
[Required(ErrorMessage = "Please enter a name")]
public String Name { get; set; }
public ICollection<Model.Cast> Cast { get; set; }
}
public class Actor
{
public Int32 ID { get; set; }
[MaxLength(75)]
public String Name { get; set; }
public ICollection<Model.Cast> Cast { get; set; }
}
[Table("Cast")]
public class Cast
{
[Key, Column(Order = 0)]
public int ActorId { get; set; }
[Key, Column(Order = 1)]
public int FilmId { get; set; }
[MaxLength(500)]
public String Role { get; set; }
[ForeignKey("ActorId")]
public Actor Actor { get; set; }
[ForeignKey("FilmId")]
public virtual Film Film { get; set; }
}
公共级电影
{
公共Int32 ID{get;set;}
[列(“FilmName”)、MinLength(2)、MaxLength(100)]
[必需(ErrorMessage=“请输入名称”)]
公共字符串名称{get;set;}
公共ICollection强制转换{get;set;}
}
公共级演员
{
公共Int32 ID{get;set;}
[MaxLength(75)]
公共字符串名称{get;set;}
公共ICollection强制转换{get;set;}
}
[表(“铸件”)]
公开课演员
{
[键,列(顺序=0)]
公共int ActorId{get;set;}
[键,列(顺序=1)]
public int FilmId{get;set;}
[最大长度(500)]
公共字符串角色{get;set;}
[外键(“ActorId”)]
公共参与者{get;set;}
[ForeignKey(“FilmId”)]
公共虚拟电影{get;set;}
}
太棒了,非常感谢。实际上,我已经尝试过这种方法,但是我没有在Actor类中包含public ICollection Cast{get;set;}
。非常感谢。public ICollection Cast{get;set;}
是虚拟的吗?是的,如果您想使用延迟加载,请将其设置为虚拟。这不是传统的映射,它是规范数据库的一种非常有效的方法。谢天谢地,有一个解决方案,因为以这种方式建模很重要。也许我没有很好地表达自己。。。e、 例如,大多数OODMB要求每个表都有自己的唯一键,一个字段作为每行(对象)的唯一标识符。由于我们使用ORMs将关系数据库映射到应用程序的域/模型对象,因此在如何创建DB表以及如何创建表示这些表的类方面,始终存在著名的不匹配阻抗。出于这个原因,我毫无冒犯地称之为遗留映射。有时,在DB中以更接近类的方式创建表更容易,只是为了简化映射。明天或晚些时候,EF可能会改变。