【问题标题】:Entity Framework Code First One Property of Class and List of The Same Class实体框架代码第一个类的属性和同一个类的列表
【发布时间】:2017-06-11 15:27:09
【问题描述】:

我正在使用实体框架代码优先方法

我有课

public class Movie
{
    public int Id { get; set; }

    public string Title { get; set; }

    public Person Director { get; set; }

    public virtual ICollection<Person> Actors { get; set; }
}

还有一个班级

public class Person
{
    public int Id { get; set; }

    public string Name { get; set; }
}

创建数据库后,我得到一个表MoviesIdTitleDirector_Id 和一个表PersonIdName。 我希望有一个表 Movies_Persons 与列 Movie_IdActor_Id

我怎样才能做到这一点?

【问题讨论】:

    标签: c# sql sql-server entity-framework ef-code-first


    【解决方案1】:

    您的问题是,您没有告诉 Person 类,每个人可以有多个电影。

    因此,通过在您的人员类中添加以下行:

    public virtual ICollection<Movie> Movies { get; set; }
    

    您的实体知道您的两个类可以对另一个类有多个引用。 为了满足这个要求,Entity Framework 将使用Movie_IDPerson_ID 创建第三个表。

    如果您想了解更多信息,请查找: 实体框架 - 多对多关系

    或点击此链接: http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

    如果您不熟悉实体框架,也可以查看该页面上的其他文章。

    更新: 抱歉,我错过了,您已经有另一个对您的人员表的引用。 这里你要告诉你的实体框架,你想通过fluent api以哪种方式引用这两个表。 查看this stackoverflow answer。这应该够了吧。 您必须将此代码插入到您的 DbContext 类的 OnModelCreating 函数中。

    所以你的最终代码应该是这样的:

    public class Movie
    {
        public int Id { get; set; }
    
        public string Title { get; set; }
    
        public virtual Person Director { get; set; }
    
        public virtual ICollection<Person> Actors { get; set; }
    }
    
    public class Person
    {
        public int Id { get; set; }
    
        public string Name { get; set; }
    
        public virtual ICollection<Movie> Movies_Actors { get; set; }
    
       public virtual ICollection<Movie> Movies_Directors { get; set; }
    }
    

    并在您的 OnModelCreating 中添加以下代码:

    modelBuilder.Entity<Movie>()
                .HasMany(a => a.Actors)
                .WithMany(a => a.Movies_Actors)
                .Map(x =>
                {
                    x.MapLeftKey("Movie_ID");
                    x.MapRightKey("Person_ID");
                    x.ToTable("Movie_Actor");
                });
    
    modelBuilder.Entity<Movie>()
    .HasRequired<Person>(s => s.Director)
    .WithMany(s => s.Movies_Directors);
    

    我无法测试代码,但这应该可以解决问题。 如果您必须进行一些调整才能使其正常工作,请将它们添加到 cmets 中,以便其他人可以从中受益。

    【讨论】:

    • 它不起作用。它只是在 Person 中创建一个列 Movie_Id。如果我删除 Director,那么我会得到一个中间表,但是当 Director 属性存在时它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多