【问题标题】:EF Core creates multiple foreign key columnsEF Core 创建多个外键列
【发布时间】:2019-12-24 07:54:24
【问题描述】:

我将 EF Core 与 .NET Core 3.1 一起使用

我有一个简单的客户端-事件关系示例:

public class BaseEntity
{
    [Key]
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime? ModifiedOn { get; set; }

}

public class Client : BaseEntity
{
    
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }

}

public class Event : BaseEntity
{

    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public Client Client { get; set; }
}

在我的上下文中,我使用 Fluent API 来指定关系:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
        
    modelBuilder.Entity<Event>()
        .HasOne<Client>()
        .WithMany()
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);

}

当我创建迁移时,客户端表看起来很好,但事件表看起来像这样:

migrationBuilder.CreateTable(
            name: "Events",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                CreatedOn = table.Column<DateTime>(nullable: false),
                ModifiedOn = table.Column<DateTime>(nullable: true),
                Start = table.Column<DateTime>(nullable: false),
                End = table.Column<DateTime>(nullable: false),
                ClientId = table.Column<int>(nullable: false),
                ClientId1 = table.Column<int>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Events", x => x.Id);
                table.ForeignKey(
                    name: "FK_Events_Clients_ClientId",
                    column: x => x.ClientId,
                    principalTable: "Clients",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
                table.ForeignKey(
                    name: "FK_Events_Clients_ClientId1",
                    column: x => x.ClientId1,
                    principalTable: "Clients",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
            });

最后我得到了两列:ClientIdClientId1。为什么 Entity Framework 会为我的关系创建两列?

到目前为止,我还没有使用 Fluent API,它仅与自动生成的影子属性 ClientId 完美配合,但我需要配置级联删除表单这个实体,因为没有其他方法可以做到,我指定了关系如上图。从那时起,它就有了额外的外键列。

我尝试指定一个外键列:

modelBuilder.Entity<Event>()
            .HasOne<Client>()
            .WithMany()
            .IsRequired()
            .HasForeignKey("ClientId")
            .OnDelete(DeleteBehavior.Cascade);

目前没有效果。有什么方法可以告诉 EF im 使用自动生成的阴影属性?

编辑#1:

我也尝试像这样自行指定外键属性:

public class Event : BaseEntity
{

    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public int ClientId { get; set; }
    public Client Client { get; set; }
}

然后

modelBuilder.Entity<Event>()
    .HasOne<Client>()
    .WithMany()
    .IsRequired()
    .HasForeignKey(e => e.ClientId)
    .OnDelete(DeleteBehavior.Cascade);

但还是没有效果。

【问题讨论】:

    标签: c# .net-core entity-framework-core


    【解决方案1】:

    事实证明,关系可能是空的 - 将决定留给框架,但这并不能真正满足您的兴趣。我修改了我的代码,因此明确指向了导航属性,并且 EF 识别了这种关系并停止为列创建阴影属性:

    modelBuilder.Entity<Event>()
        .HasOne<Client>(e => e.Client)
        .WithMany()
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      {
      
          public DateTime Start { get; set; }
          public DateTime End { get; set; }
          public int? ClientId { get; set; }
      
          [ForeignKey("ClientId ")]
          public virtual Client Client { get; set; }
      }
      

      【讨论】:

      • 其实这个我试过了,可惜不行。它只会告诉 EF 它应该在 Event 实体中查找 ClientId 属性,但是由于没有明确声明的属性并且我指望框架本身会创建它 - 无论我让框架创建它都不会产生影响或将自己创建它。 FluentAPI 不会将此识别为关系,并会强制创建新属性
      • 试试这个,没有 ```c# .HasOne(e => e.Client)
      猜你喜欢
      • 2021-05-23
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2018-09-02
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多