[英]EF6 One to One or Zero Relationship (Fluent API)
我有这样的类(简化):
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中完成。 我能得到的最接近的信息如下。 但是在我走之前,有一些事情要注意。 MoneyId
字段已从Transaction
删除。 LocalId
字段已从TransactionMoney
删除。 外键通过数据注释指定。 如果其中任何一个不可接受,则跳过其余部分。
实体:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.