一对一关系无法解决“关系约束中的从属角色和主要角色必须相同”的问题

时间:2019-05-02 12:45:25

标签: c# entity-framework code-first

我正在尝试创建一个包含所有FK的组合键。为了唯一,我需要4个属性。我添加了两个,但是第三个FK和第四个FK抛出错误,因为它们来自同一张表,并且我不确定如何设置它?

我已经阅读了很多答案,但我只是不明白如何写出来。我正在使用Entity Framework开发ASP.Net MVC Web应用程序,并且研究了以下内容:

https://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx

https://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx

Defining multiple Foreign Key for the Same table in Entity Framework Code First

Entity Framework Code First - two Foreign Keys from same table

https://forums.asp.net/t/2135907.aspx?Multiple+Relationships+Foreign+Keys+Between+Two+Tables+in+Classes+

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);
        }

0 个答案:

没有答案