C# EF代码优先:多对多,单向导航

C# EF代码优先:多对多,单向导航,c#,entity-framework-4.1,ef-code-first,C#,Entity Framework 4.1,Ef Code First,我正在尝试创建一个代码优先模型,其中一个人可以有许多喜爱的电影,但我不希望电影表中有FK 实现这一点的唯一方法是让EF在两个实体之间创建一个链接表,为此(afaik)我在Movies实体上创建了一个与Person相关的集合属性 public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; }

我正在尝试创建一个代码优先模型,其中一个人可以有许多喜爱的电影,但我不希望电影表中有FK

实现这一点的唯一方法是让EF在两个实体之间创建一个链接表,为此(afaik)我在Movies实体上创建了一个与Person相关的集合属性

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual IList<Movie> FavouriteMovies { get; set; }
}

public class Movie
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual IList<Person> People { get; set; } // I don't want this here :(
}
但是在这样做的时候,EF不会创建一个链接表,它只会在Movies表中点击Person\u Id FK列

我不希望这种情况发生,因为电影不应该与人有任何关系,我可能想把它与其他事情联系起来


那么我该如何吃蛋糕呢?

应该是这样的。如何添加实体? 以下是一个示例:

public class Character : BaseEntity
{
    public string Name { get; set; }
    public bool IsEvil { get; set; }
    public virtual ICollection<Videogame> Videogames { get; set; } 
}
public class Videogame : BaseEntity 
{
    public string Name { get; set; }
    public DateTime ReleasedDate { get; set; }
    public virtual ICollection<Character> Characters { get; set; }
    public Author Author { get; set; }
}
公共类字符:BaseEntity
{
公共字符串名称{get;set;}
公共布尔IsEvil{get;set;}
公共虚拟ICollection视频游戏{get;set;}
}
公共类电子游戏:BaseEntity
{
公共字符串名称{get;set;}
公共日期时间释放日期{get;set;}
公共虚拟ICollection字符{get;set;}
公共作者{get;set;}
}
以下是添加记录的位置:

[Test]
public void CreateJoinTable()
{
    var character = new Character() {Name = "Wario", IsEvil = true};
    var videogame = new Videogame() {Name = "Super Mario Bros 20", ReleasedDate = DateTime.Now , Characters = new Collection<Character>()};
    videogame.Characters.Add(character);
    var context = new NerdContext();
    context.Add(videogame);
    context.SaveAllChanges();
}
[测试]
public void CreateJoinTable()
{
var character=new character(){Name=“Wario”,IsEvil=true};
var videogame=new videogame(){Name=“Super Mario Bros 20”,ReleasedDate=DateTime.Now,Characters=new Collection()};
视频游戏。角色。添加(角色);
var context=new NerdContext();
添加(视频游戏);
SaveAllChanges();
}

下面是代码片段的来源:

我添加它们的方式与您在示例中显示的方式相同,但我遇到的问题是,角色中不应有与视频游戏相关的属性。因此,如果我们从Character中去掉Videogames属性,EF将不会创建该链接表。如何在此实例中创建链接表?角色将只具有链接到视频游戏的导航属性。从逻辑上讲,这是正确的,因为表在联接表中链接,并且建立了多对多关系。您可以为没有列表的角色定义接口,或者使用ef fluent配置定义映射规则。就我个人而言,我认为把这样一个简单的实现过分复杂化是不值得的。最好是定义一个接口,或者将您的POCO映射到一个新类,该类带有您需要的字段。
[Test]
public void CreateJoinTable()
{
    var character = new Character() {Name = "Wario", IsEvil = true};
    var videogame = new Videogame() {Name = "Super Mario Bros 20", ReleasedDate = DateTime.Now , Characters = new Collection<Character>()};
    videogame.Characters.Add(character);
    var context = new NerdContext();
    context.Add(videogame);
    context.SaveAllChanges();
}