使用ASP.NET核心在流暢的API中創建包含外鍵的複合主鍵

c# entity-framework-core

這裡的問題是如何生成由兩個外鍵組成的複合主鍵?

我努力了:

public class ActiveQuestions_Questions 
{
    [Column(Order = 0), Key, ForeignKey("ActiveQuestion")]
    public string ActiveQuestionId {get; set;}

    [Column(Order = 1), Key, ForeignKey("Question")]
    public string QuestionId {get; set; }
}

這給了我:實體類型'ActiveQuestions_Questions'具有使用數據註釋定義的複合主鍵。要設置複合主鍵,請使用fluent API。

然後我嘗試在沒有註釋的模型構建器中使用流暢的api。

builder.Entity<ActiveQuestions_Questions>(
            build => 
            {
                build.HasKey(t => new {t.ActiveQuestionId, t.QuestionId}); 
                build.HasOne(t => t.QuestionId).WithOne().HasForeignKey<Question>(qe => qe.QuestionId);
                build.HasOne(t => t.ActiveQuestionId).WithOne().HasForeignKey<ActiveQuestion>(qe => qe.ActivateQuestionId); 
            }
        );    

這給了我:導航屬性'QuestionId'無法添加到實體類型'ActiveQuestions_Questions',因為實體類型'ActiveQuestions_Questions'上已存在具有相同名稱的屬性。

誰可以指出我正確的方向?

問題類

public class Question 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string QuestionId {get; set;}

    [Required]
    public string Text {get; set;}
}

ActiveQuestion類:

public class ActiveQuestion 
{
    private DateTime _lastUpdated = DateTime.Now; 

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string ActivateQuestionId {get; set;}

    public DateTime LastUpdated 
    {
        get 
        {
            return this._lastUpdated; 
        }
        set 
        {
            this._lastUpdated = value;
        }
    }
}

熱門答案

在EF Core中,不支持使用KeyAttribute定義復合PK,因此必須使用流暢的API來配置複合PK。

build.HasKey(t => new {t.ActiveQuestionId, t.QuestionId}); 

您在代碼中使用的上述語法是定義復合PK的正確方法。有關更多信息,請參閱文檔中的

您的代碼失敗的原因是關係配置不正確。 HasOne / WithOne API應該與導航屬性(針對其他實體類型的屬性)一起使用。在您的配置中,您將在HasOne調用中傳遞原始屬性。由於模型中已經添加了具有相同名稱的屬性(通過約定和HasKey調用),因此它會拋出異常。即使沒有添加它們,也會有不同的例外。 以下是有關如何使用Fluent API定義關係的文檔鏈接。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow