我正在使用Entity Framework 6.1.3
并拥有如下所示的两个模型。但是,当我运行迁移时,我得到以下错误:
无法确定之间关联的主要结束 类型'Example.Models.GiftVoucher'和 'Example.Models.Payment'。这个的主要目的 必须使用以下任一方式显式配置关联 关系流畅的API或数据注释。
我搜索过它并找到了this question。其中一个解决方案是使用Required
属性。
但是,我不知道如何在Entity Framework中执行以下操作:
Purchase_Id
和Redemption_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; }
}
答案 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会抛出