HasPrincipalKey(),将主表外键绑定到从表的其他字段
有两个模型:
1 2 3 4 5 6 7 8 9 10 11 | public class Customer { public int Id { get ; set ; } public int Number { get ; set ; } public int ParentNumber { get ; set ; } public string Name { get ; set ; } public string Address { get ; set ; } public string City { get ; set ; } public string Country { get ; set ; } public string Language { get ; set ; } } |
和
public class Batch { public int Id { get; set; } public int Number { get; set; } public string FileName { get; set; } public string ArticleNumber { get; set; } public string ArticleDescription { get; set; } public int Weight { get; set; } public DateTime ProductionDate { get; set; } public DateTime DeliveryDate { get; set; } public DateTime BestBeforeDate { get; set; } public DateTime? ApprovedDateTime { get; set; } public int CustomerId { get; set; } public virtual Customer Customer { get; set; } }
一批可以拥有一个客户.但是,由于我们要从另一个系统导入数据,因此我们决定不接管其ID.
现在,外键显示尝试通过属性Customer.Id查找客户.
我试图实现从Batch.Customer(Id)获取外键指向Customer.Number
我将如何成功做到这一点?
我尝试通过将Customer.Number定义为具有Key属性的键..但这使主键从Id转到Number,这不是我想要的。
答案:
您要问的是在EF Core之前在EF中是不可能的.幸运的是,在EF Core中,可以使用Alternate Keys功能来完成.但是请注意,为了能够使用它,您的Cusomer.Number字段应该是唯一的.
该解决方案需要Fluent API配置.
首先将Customer.Number定义为备用键:
modelBuilder.Entity<Customer>()
.HasAlternateKey(e => e.Number);
然后按如下所示建立关系:
modelBuilder.Entity<Batch>() .HasOne(e => e.Customer) .WithMany() .HasForeignKey(e => e.CustomerId) .HasPrincipalKey(e => e.Number);
最后两行将满足您的需求.
附带说明一下,最好为属性(和列)命名为CustomerNumber,以避免混淆其中的值.
引用:原文链接
本文作者:暴躁老砚
本文链接:https://www.cnblogs.com/Yan3399/p/15469885.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
花里胡哨菜鸡的后端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步