【问题标题】:Creating composite primary key consisting off foreign keys in fluent API with ASP.NET core使用 ASP.NET 核心在流式 API 中创建由外键组成的复合主键
【发布时间】:2023-03-27 06:25:01
【问题描述】:

这里的问题是如何生成由两个外键组成的复合主键?

我试过了:

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

【问题讨论】:

  • 能否贴出QuestionActiveQuestion实体的相关部分(至少包含PK属性和ActiveQuestions_Questions相关导航属性)
  • @IvanStoev 添加了 Question 和 ActiveQuestion 类。
  • 谢谢。我认为当前发布的答案正在涵盖此案。如果不清楚,PK fluent 配置是正确的,但两个 FK 都不是。 build.HasOne(t =&gt; t.QuestionId) 应该是 build.HasOne&lt;Qustion&gt;()build.HasOne(t =&gt; t.ActiveQuestionId) 应该是 build.HasOne&lt;ActiveQuestion&gt;() 以反映您的实体类中缺少导航属性。
  • 谢谢@IvanStoev :)

标签: c# entity-framework-core


【解决方案1】:

在 EF Core 中,不支持使用KeyAttribute 定义复合 PK,因此您必须使用 fluent API 来配置复合 PK。

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

您在代码中使用的上述语法是定义复合 PK 的正确方法。有关详细信息,请参阅文档中的 Keys

您的代码失败的原因是关系配置不正确。 HasOne/WithOne API 应该与导航属性(针对其他实体类型的属性)一起使用。在您的配置中,您在 HasOne 调用中传递了一个原始属性。由于模型中已经添加了同名的属性(通过约定和HasKey 调用),因此会引发上述异常。即使它们没有被添加,也会有不同的例外。 Here 是有关如何使用流式 API 定义关系的文档的链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2017-07-22
    • 2016-06-08
    相关资源
    最近更新 更多