EF6一对一或零关系(Fluent API)
本文关键字:Fluent API 关系 一对一 EF6 | 更新日期: 2023-09-27 18:21:58
我有这样的类(简化):
public class Transaction
{
public int LocalId { get; set; }
public int MachineId { get; set; }
public virtual Machine Machine { get; set; }
public int? MoneyId { get; set; }
public virtual TransactionMoney Money { get; set; }
}
public class Machine
{
public int Id { get; set; }
public string Name { get; set; }
}
public class TransactionMoney
{
public int LocalId { get; set; }
public int MachineId { get; set; }
public virtual Machine Machine { get; set; }
public int TransactionId { get; set; }
public virtual Transaction Transaction { get; set; }
}
我希望有关系交易1<->0…1 TransactionMoney,其中Money中的外键应为TransactionId和MachineId(连接到事务的LocalId和MachineId)。我需要用流利的API来做这件事。
我尝试过的是:
modelBuilder.Entity<Transaction>()
.HasOptional(t => t.Money)
.WithRequired(t => t.Transaction)
.HasForeignKey() <--- there is no such method
另一侧
modelBuilder.Entity<TransactionMoney>()
.HasRequired(t => t.Transaction)
.WithOptional(t => t.Money)
.HasForeignKey() <--- there is no such method
modelBuilder.Entity<TransactionMoney>()
.HasRequired(t => t.Transaction)
.WithOptional(t => t.Money)
.Map(a => a.MapKey("TransactionId", "MachineId"));
事实证明,你所针对的设计无法在EF中完成。我能得到的最接近的如下。但在我离开之前,有一些事情需要注意。从CCD_ 2中移除CCD_ 1字段。CCD_ 3字段从CCD_。外键是用数据注释指定的。如果其中任何一个是不可接受的,就跳过其余部分。
实体:
public class Transaction
{
public int LocalId { get; set; }
public int MachineId { get; set; }
public virtual Machine Machine { get; set; }
public virtual TransactionMoney Money { get; set; }
}
public class Machine
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Transaction> Transactions { get; set; }
public virtual ICollection<TransactionMoney> Money { get; set; }
}
public class TransactionMoney
{
public int MachineId { get; set; }
public virtual Machine Machine { get; set; }
public int TransactionId { get; set; }
[ForeignKey("TransactionId,MachineId")]
public virtual Transaction Transaction { get; set; }
}
配置
modelBuilder.Entity<Transaction>()
.HasKey(t => new { t.LocalId, t.MachineId })
.HasRequired(t => t.Machine)
.WithMany(t => t.Transactions)
.HasForeignKey(t => t.MachineId);
modelBuilder.Entity<TransactionMoney>()
.HasRequired(t => t.Machine)
.WithMany(t => t.Money)
.HasForeignKey(t => t.MachineId);
modelBuilder.Entity<TransactionMoney>()
.HasKey(t => new { t.TransactionId, t.MachineId })
.HasRequired(t => t.Transaction)
.WithOptional(t => t.Money);