实体框架 - 如何将约束应用于模型属性?

时间:2018-02-09 03:33:29

标签: c# entity-framework erd

我正在使用Entity Framework 6.1.3并拥有如下所示的两个模型。但是,当我运行迁移时,我得到以下错误:

  

无法确定之间关联的主要结束   类型'Example.Models.GiftVoucher'和   'Example.Models.Payment'。这个的主要目的   必须使用以下任一方式显式配置关联   关系流畅的API或数据注释。

我搜索过它并找到了this question。其中一个解决方案是使用Required属性。

但是,我不知道如何在Entity Framework中执行以下操作:

  • 将两个模型中的GiftVoucherId和PaymentId重命名为Purchase_IdRedemption_Id的外键,如图所示。
  • 然后在实体框架中执行与此CONSTRAINT fk-giftvoucher-table FOREIGN KEY (Purchase_Id) REFERENCES PAYMENT (PaymentId)相同的操作。

付款模式

public class Payment { 

    public int Id { get; set; }

    [Required]
    public DateTime DateTime { get; set; }

    public double Amount { get; set; }

    [Required]
    public int GiftVoucherId { get; set; }
    public GiftVoucher GiftVoucher { get; set; }

}

礼品券型号

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

    public double Amount { get; set; }

    [Required]
    public int PaymentId { get; set; }
    public Payment Payment { get; set; }

}

enter image description here

1 个答案:

答案 0 :(得分:2)

我不倾向于使用一对一关系...除非我想垂直分区以满足性能需求或者有不间断的OCD需要将问题分开。

*注意:在SQL Server中,技术上不可能实现一对一关系。它总是一到零或一个。 EF在不在DB中的实体形成一对一的关系。*

但是,文档是你的朋友

Configuring a Relationship Where Both Ends Are Required (One-to-One)

  

在大多数情况下,实体框架可以推断出哪种类型   依赖,哪个是关系中的主体。 但是,何时   关系的两端都是必需的或双方都是可选的   实体框架无法识别依赖关系和主体。什么时候   关系的两端都是必需的,使用WithRequiredPrincipal   WithRequiredDependent方法后的 HasRequired。   ...

鉴于以下

public class GiftVoucher
{
    // your primary key
    public int GiftVoucherId { get; set; }
    public virtual Payment Payment { get; set; }

    // other properties
    public double Amount { get; set; }
}

public class Payment 
{ 
    // We need to share the same key
    public int GiftVoucherId { get; set; }
    public virtual GiftVoucher GiftVoucher { get; set; }

    // other properties
    public DateTime DateTime { get; set; }
    public double Amount { get; set; }
}

我们可以像这样使用Fluent API

// Configure the primary key for the OfficeAssignment 
modelBuilder.Entity<Payment>() 
    .HasKey(t => t.GiftVoucherId); 

// we are essentially making GiftVoucher the principle in the DB
modelBuilder.Entity<GiftVoucher>() 
    .HasRequired(t => t.Payment) 
    .WithRequiredPrincipal(t => t.GiftVoucher);

所以基本上HasRequired需要GiftVoucher,而WithRequiredPrincipal需要Payment ..反过来,如果上述不满意,EF会抛出