如何在零到零或一对一关系中设置流畅的API关系

时间:2017-09-10 15:27:51

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

我是ASP.Net MVC和Entity Framework的初学者。我坚持使用Fluent API设置一种关系。

所以,我有两个模型:

模型A

Public Class A
{
    [Key]
    public int AId {get; set;}
    public string AName {get;set;}
}

模型B

Public Class B
{
   [Key]
   public int BId {get; set;}
   public string BName
}

业务逻辑:

  1. A可以独立存在
  2. B也可以独立存在

  3. 但在某些情况下,例如让我们说当用户在UI中的文本框中输入“2”时。在那种情况下,我希望A将BId存储在其中。

  4. 表A中开始存在BId后,表A中不再存在

  5. 现在我想设置这种关系的原因是当BId存储在A表中时,我需要确保它不是一些随机整数。我希望存储在A表中的BId确实存在于B表中。

    我的想法:

    我需要Optional Unique Foreign Key Relationship。但我不确定如何在CodeFirst Fluent API方法中实现它

    以下是我现在所拥有的。

    模型A

    Public Class A
    {
        [Key]
        public int AId {get; set;}
        public string AName {get;set;}
        public int BId {get;set;}
        public virtual B {get;set;}
    }
    

    问题1: 如何确保当我在A表中时,它必须是B表中的PK 问题2:  我正在处理什么类型的实体关系? 1..0或1..1或其他什么?

    修改

    我想要类似的东西:

    dBModelBuilder.Entity<A>()
                        .HasOptional(r=> r.B) 
                        ........
    

1 个答案:

答案 0 :(得分:1)

无需明确配置此项。只需使A的FK属性可以为空,约定将创建您想要的映射。 EG:

public class A
{
    public int AID { get; set; }
    public string Name { get; set; }
    public int? BID { get; set; }
    public virtual B B { get; set; }
}

public class B
{
    public int BId { get; set; }
    public string Name { get; set; }
}

在Fluent API中执行此操作将如下所示:

        modelBuilder.Entity<A>()
            .HasOptional(a => a.B)
            .WithMany()
            .HasForeignKey(a => a.BID);