【问题标题】:How to define One-to-Zero-to-One relationship with constraint using Fluent API如何使用 Fluent API 定义带约束的一对零关系
【发布时间】:2018-05-30 08:10:35
【问题描述】:

我有两个表如下

public class Person {
[Key]
public int Id { get; set;}
public string Name {get; set;}
}

public class Office {
[key]
public int OfficeId {get; set;}
public string OfficeName { get; set;}
public virtual ICollection<Person> Persons { get; set;}
}

现在我想要第三个表中的关系,例如

[PersonHasOffice]
|  PersonId     | OfficeId   |

这样用户可以有只有一个或没有办公室。 当我尝试以下操作时,生成的关系是多对多的!

modelBuilder.Entities<Office>
.HasMany(e=>e.Persons)
.WithMany()
.Map(m=>m.ToTable("PersonHasOffice").MapLeftKey("OfficeId").MapRightKey("Id"));

如何在 Person 端获得一对零对一的关系,这样一个人要么有办公室,要么没有办公室。

【问题讨论】:

  • 用户和人是一样的吗?
  • 是的。对不起这个错误。我现在已经更正了。
  • 问题解决了吗?
  • 请在下面查看我对您提出的解决方案的评论。

标签: c# asp.net-mvc entity-framework ef-code-first ef-fluent-api


【解决方案1】:

您可以在Person 表中添加一个可以为空的列OfficeId 作为外键,而不是使用额外的映射表。

public class Person 
{
    [Key]
    public int Id { get; set;}
    public string Name {get; set;}

   [ForeignKey("OfficeId")]
   public virtual Office  Office  {get;set;}
   public int? Office Id {get;set;} = null;
}

将此更改添加到 Person 类,然后运行 ​​Add-Migration &lt;MigrationName&gt; 并从包管理器控制台运行 Update-Database

【讨论】:

  • 但是这样,我将在表中包含空条目。我想通过使用映射表来避免这种情况。无论如何用映射表来实现它。 VS 使用 Database First 方法为此映射生成相同的代码,但不知何故,当我编写它时,关系不一样!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2013-03-02
  • 1970-01-01
  • 2010-12-15
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多