使用 EF4 Code First 具有 2 个相同类型的属性/关系时出错

发布于 2024-10-31 03:56:18 字数 380 浏览 3 评论 0原文

我有一个与 Y 具有多对多关系的类 X。如果我只有该属性,那么 EF 将正确生成第三个 XY 表。但是,如果我想要与类型 X 建立多对多关系,并且与 Y 建立一对多关系。

为了说明这一点,我有这样的事情:

class Location
{
  public ICollection<Person> Visitors {get;set;}
}

class Person
{
  public Location Home {get;set}
  public ICollection<Location> VisitedPlaces {get;set;}
}

当我有两个引用时,EF 停止生成第三个表,只给我每个属性都是 1 对 1 的关系!

I have a class X that has a many to many relationship with Y. If I only have that property then EF will correctly produce the 3rd XY table. However if I want to have that many to many relationship to type X AND also have a 1 to many relationship to Y.

To illustrate say I have something like this:

class Location
{
  public ICollection<Person> Visitors {get;set;}
}

class Person
{
  public Location Home {get;set}
  public ICollection<Location> VisitedPlaces {get;set;}
}

When I have both references, EF stops genereting the 3rd table and only gives me a 1 to 1 relationship for each property!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

莫相离 2024-11-07 03:56:18

您必须将其添加到派生上下文中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Person>()
        .HasRequired(p => p.Home)
        .WithMany()
        .WillCascadeOnDelete(false);
}

问题是 EF 无法正确推断映射,因为它不知道 Location 类中的 Visitors 集合是否是其中的一部分声明的多对多关系或一对多关系(它不能是两者的一部分)。我的示例定义一对多关系在 Location 上没有导航属性,因此 EF 现在知道它是多对多关系的一部分。

You must add this to your derived context:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Person>()
        .HasRequired(p => p.Home)
        .WithMany()
        .WillCascadeOnDelete(false);
}

The problem is that EF is not able to infer correctly the mapping because it doesn't know if Visitors collection in Location class is part of declared many-to-many relation or one-to-many relation (it can't be part of both). My example defines that one-to-many relation doesn't have navigation property on Location so EF now knows that it is part of many-to-many relation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文