EF Core 在已定义外键时尝试创建新外键

问题描述 投票:0回答:1

我有两个通过外键“PickingListId”链接的类。它们都从 SQL 视图中绘制数据,因此我将 PickingList 重命名为 PickingListView。它之前工作得很好,因为它似乎正确猜测了外键(PickingListId)。但是现在它试图猜测外键是“PickingListViewId”,所以我尝试显式标记外键。

以下是我的两节课。我删除了 [Key] 和 [ForeignKey] 注释,认为它们可能与 Fluent API 发生冲突。

public class PickingListView
{
    public int PickingListId { get; set; }
    public ICollection<PickingListLine> Lines { get; set; }
}

 public class PickingListLine
    {
        public int PickingListLineId { get; set; }
        public int PickingListId { get; set; }
        public PickingListView PickingListView { get; set; }
    }

以下是我的 Fluent API 配置:

                modelBuilder.Entity<PickingListView>(entity =>
                {
                    entity.ToView("view_PickingList").HasKey(e => e.PickingListId);
                    entity.HasMany(e => e.Lines)
                        .WithOne(e => e.PickingListView)
                        .HasForeignKey(e => e.PickingListId)
                        .IsRequired();
 
                });
           modelBuilder.Entity<PickingListLine>(entity =>
            {
                entity.ToView("view_PickingListLine").HasKey(e => e.PickingListLineId);
                entity.Property(e => e.PickingListId).HasColumnName("PickingListId");
                entity.HasOne(e => e.PickingListView)
                    .WithMany(e => e.Lines)
                    .HasForeignKey(e => e.PickingListId);
            });

自从在 Fluent API 中将配置添加到 PickingListLine 后,我现在收到错误

Microsoft.Data.SqlClient.SqlException(0x80131904):列名“PickingListId1”无效。

我查看了生成的 SQL,并且连接正确地使用了 PickingListId,但是它试图选择不存在的 PickingListId1 列。

如何正确地将 PickingListLine 的 PickingListId 标记为链接到 PickingListView 类的外键?

c# entity-framework asp.net-core foreign-keys
1个回答
0
投票

1

Microsoft.Data.SqlClient.SqlException(0x80131904):列名“PickingListId1”无效。

此错误表示 Entity Framework Core 生成的 SQL 语句使用了不存在的列

PickingListId1
。这通常是由于不正确的配置或重复问题造成的。

确保您的列名称拼写正确。

2

entity.Property(e => e.PickingListId).HasColumnName("PickingListId");

如果数据库中的列名与属性名相同,则可以省略

HasColumnName
配置。

© www.soinside.com 2019 - 2024. All rights reserved.