【问题标题】:One to one relationship with FK in one direction与FK在一个方向上的一对一关系
【发布时间】:2014-11-19 22:02:21
【问题描述】:

我如何获得以下关系以仅在Entity2中生成FK?

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

     public virtual Entity2 Entity2 { get; set; }
  }

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

     public int? Entity1Id { get; set; }

     public virtual Entity1 Entity1 { get; set; }
  }

我希望 Entity1 能够获得对 Entity2 的引用(让 EF 延迟加载它),但我不希望 Entity1 在数据库中对 Entity2 有一个 FK,我只希望 Entity2 对 Entity1 有一个 FK .这可能吗?在我的数据库上下文中,我在 OnModelCreating 中尝试的一切都没有让我得到我真正想要的东西。

我能得到的最接近的是:

  modelBuilder.Entity<Entity2>().HasOptional(e => e.Entity1).WithOptionalDependent(e => e.Entity2);

但是,这将创建具有 Entity1Id 列和 Entity1_Id FK 列到 Entity1 的 Entity2 表,而不是只创建应该是 Entity1 的 FK 的单个 Entity1Id 列。

另外,如果有人问起,Entity1Id 属性是有意为 null 的 int,因为 Entity2 实例/表记录需要独立存在而没有到 Entity1 的链接。

【问题讨论】:

  • 如果是一对多而不是一对一的关系,为什么你能做到这一点?

标签: c# entity-framework ef-code-first one-to-one


【解决方案1】:

删除 OnModelCreating 中的代码,并将此注解添加到您的 Entity2

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

 [ForeignKey("Entity1")]
 public int? Entity1Id { get; set; }

 public virtual Entity1 Entity1 { get; set; }

}

或者你可以试试这个(不知道行不行)

modelBuilder.Entity<Entity2>()
.HasOptional(e => e.Entity1)
.WithOptionalDependent(e => e.Entity2)
.Map(m => { m.MapKey("Entity1Id"); });

【讨论】:

  • 谢谢!所以我真的想避免使用数据注释方法 - 这是唯一的方法吗?
  • 它不喜欢任何一种解决方案 - 第一个(数据注释路由)它说多重性在关系“Entity2_Entity1”中的角色“Entity2_Entity1_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是“*”。对于另一种解决方案,它抱怨每个属性名称必须是唯一的,并表明 Entity1Id 已经在那里定义,所以它似乎试图创建该列两次。
  • 旁注,modelBuilder.Entity().HasOptional(e => e.Entity1).WithMany().HasForeignKey(e => e.Entity1Id);似乎在构造的表中产生与 modelBuilder.Entity().HasOptional(e => e.Entity1).WithOptionalDependent(e => e.Entity2); 相同的结果...所以我想知道如果它们产生相同的东西,它们之间的真正区别是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多