实体框架由于异常而无法检索数据

时间:2011-08-09 20:17:55

标签: asp.net-mvc entity-framework-4.1

以下是我的两个POCO:

[Table("Movie", Schema= "dbo")]
public  class Movie: BaseClass
{
    public string TitleName { get; set; }

    public virtual ICollection<Actor> Actor{ get; set; }

}

[Table("Actor", Schema="dbo")]
public class Actor: BaseClass
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? BirthDate { get; set; }
}

基类只是一个具有属性int id。

的类

在数据库中,有一个Movie表和一个带有MovieActor表的Actor表,用作多对多关系表。目前,我只是想获得给定电影的所有演员。但是每当dbcontext尝试访问信息时,我都会遇到这种异常:

"InnerException = {"Invalid column name 'Movie_Id'.\r\nInvalid column name 'Movie_Id'.\r\nInvalid column name 'Movie_Id'."}"

我搜索了StackOverflow类似的问题,他们建议(对其他用户)使用外键,所以我在Actor集合前面创建了一个属性。

[ForeignKey("Actor")]

然后我又得到另一个例外:

The ForeignKeyAttribute on property 'Actor' on type 
'Movie' is not valid. The foreign key name 
'Actor' was not found on the dependent type     
'Actor'.
The Name value should be a comma separated list of foreign key property names.

以前有人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:2)

EF 4.1 Code-First约定将在MovieActor之间创建一对多关系。由于您需要多对多关系,因此必须使用Fluent API进行配置:

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Movie>()
            .HasMany(m => m.Actor)
            .WithMany()
            .Map(a => {
                a.MapLeftKey("MovieId");  // your PK column name in Movie table
                a.MapRightKey("ActorId"); // your PK column name in Actor table
                a.ToTable("MovieActor");  // your join table name
            });
    }
}

答案 1 :(得分:0)

请参阅this帖子以获取更多帮助。我认为这将有助于解释如何做到这一点。您必须向下滚动才能到达外键部分。它基本上说:

  

使用外键,它们可以在模型中公开或不公开。   当我说“暴露在模型中”时,这意味着还有一个额外的   依赖实体上的属性,即主体的值   实体。在下面的代码中,属性PrimaryCategoryCode是一个   暴露主要类别的外键。

public string PrimaryCategoryCode { get; set; }

public virtual Category PrimaryCategory { get; set; }
     

要指明这一点,请使用PrimaryCategory上的ForeignKey属性   财产如下:

public string PrimaryCategoryCode { get; set; }


[ForeignKey("PrimaryCategoryCode")]
public virtual Category PrimaryCategory { get; set; }