我正在尝试创建一个包含所有FK的组合键。为了唯一,我需要4个属性。我添加了两个,但是第三个FK和第四个FK抛出错误,因为它们来自同一张表,并且我不确定如何设置它?
我已经阅读了很多答案,但我只是不明白如何写出来。我正在使用Entity Framework开发ASP.Net MVC Web应用程序,并且研究了以下内容:
Defining multiple Foreign Key for the Same table in Entity Framework Code First
Entity Framework Code First - two Foreign Keys from same table
https://febdev.wordpress.com/2013/01/30/entity-framework-mapping-references-with-composite-keys/
Entity Framework Code First One to One relationship on composite key
一个问题是我从未使用过modelbuilder,因此我从另一个站点得到的答案只是链接,但这并没有太大帮助。
public class TradeJournal
{
[Key, Column(Order = 0)]
public int UserID { get; set; }
[ForeignKey("UserID")]
public UserAccount UserAccount { get; set; }
[Key, Column(Order = 1)]
public int AccountNumber { get; set; }
[ForeignKey("AccountNumber")]
public FxAccount FxAccount { get; set; }
[Key, Column(Order = 2)]
[ForeignKey("OpenTime")]
public string OpenTime { get; set; }
public HistoricalTrade Open { get; set; }
[Key, Column(Order = 3)]
[ForeignKey("CloseTime")]
public string CloseTime { get; set; }
public HistoricalTrade Close { get; set; }
}
public class HistoricalTrade
{
[Key, Column(Order = 0)]
public int UserID { get; set; }
[ForeignKey("UserID")]
public UserAccount UserAccount { get; set; }
[Key, Column(Order = 1)]
public int AccountNumber { get; set; }
[ForeignKey("AccountNumber")]
public FxAccount FxAccount { get; set; }
[Key, Column(Order = 2)]
[JsonProperty("openTime")]
public string OpenTime { get; set; }
[Key, Column(Order = 3)]
[JsonProperty("closeTime")]
public string CloseTime { get; set; }
}
数据库迁移引发了以上错误,或者“ OpenTime不是有效实体。(类似)键必须是具有非抽象getter和setter的有效实体。
我需要将键指定为四个属性。谢谢。
编辑:我已经将“ ForeignKey(” OpenTime“)和” CloseTime“移到了引用属性上方,而我提到的完整错误来自标题,即:
在模型生成过程中检测到一个或多个验证错误:
TradeJournal_Close_Target_TradeJournal_Close_Source::关系约束中的从属角色和主体角色的属性数量必须相同。
编辑:我按照建议的方法尝试了流利的API,但遇到一个新错误:“ SqlException:INSERT语句与FOREIGN KEY约束冲突。
这发生在db.SaveChanges();
我对Fluent API的尝试是这样的:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<TradeJournal>()
.HasKey(k => new { k.UserID})
.HasRequired(r => r.User);
modelBuilder.Entity<TradeJournal>()
.HasKey(k => new { k.AccountNumber })
.HasRequired(r => r.Account);
modelBuilder.Entity<TradeJournal>()
.HasKey(k => new { k.OpenTime })
.HasRequired(r => r.Open);
modelBuilder.Entity<TradeJournal>()
.HasKey(k => new { k.CloseTime })
.HasRequired(r => r.Close);
}