Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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
Asp.net mvc 如何使代码优先实体框架4.3多对多表具有附加列?_Asp.net Mvc_Asp.net Mvc 3_Entity Framework_Entity Framework 4_Many To Many - Fatal编程技术网

Asp.net mvc 如何使代码优先实体框架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

在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 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可能会改变。