簡體   English   中英

EF Core 6 無效的列名稱 CustomerId1

[英]EF Core 6 Invalid column name CustomerId1

我看到很多人遇到非常相似的問題,但似乎無法找出適合我的答案。 不確定我做錯了什么並且看了這么久才知道我擔心我只是在風中扭曲。 我有兩個班級:

public class Customer
{
    [Key]
    public int Id {get; set;}
    [Required(ErrorMessage = "Name is required")]
    [MaxLength(100, ErrorMessage="Name cannot be longer than 100 characters")]
    public string Name {get; set;}
    public IEnumerable<CustomerLink> CustomerLinks{get; set;} 
    [MaxLength(200, ErrorMessage="Create User cannot be longer than 200 characters")]
    public string CreateUser {get; set;}
    public DateTime? CreateDate {get; set;}
    [Required(ErrorMessage = "Modify User is required")]  
    [MaxLength(200, ErrorMessage="Modify User cannot be longer than 200 characters")]
    public string ModifyUser {get; set;}
    public DateTime? ModifyDate {get; set;}     
}

public class CustomerLink
{
    [Key]
    public int Id {get; set;}
    [Required(ErrorMessage = "Customer is required")]
    public Customer Customer {get; set;}
    [Required(ErrorMessage = "Child is required")]
    public virtual Customer Child {get; set;}
    [MaxLength(200, ErrorMessage="Create User cannot be longer than 200 characters")]
    public string CreateUser {get; set;}
    public DateTime? CreateDate {get; set;}
    [Required(ErrorMessage = "Modify User is required")]  
    [MaxLength(200, ErrorMessage="Modify User cannot be longer than 200 characters")]
    public string ModifyUser {get; set;}
    public DateTime? ModifyDate {get; set;}     
}

我相信對於大多數正在閱讀的人來說這是顯而易見的,但以防萬一。 在上面的場景中,客戶有很多鏈接。 當我檢索客戶時,我需要獲取其所有鏈接。 我基本上是在我的客戶之間建立親子關系。 當我運行它時,我得到以下信息:

Microsoft.Data.SqlClient.SqlException (0x80131904): 列名稱“CustomerId1”無效。

我目前在我的Context中有這個:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<CustomerLink>()
        .HasOne(l => l.Customer)
        .WithMany()
        .OnDelete(DeleteBehavior.Restrict);                  

    modelBuilder.Entity<CustomerLink>()
        .HasOne(l => l.Child)
        .WithMany()
        .OnDelete(DeleteBehavior.Restrict);   
}

我認為我需要為此添加一些內容,以幫助 EF 更好地理解這種關系,但無法弄清楚。 我試過了:

modelBuilder.Entity<Customer>()
    .HasMany(x => x.CustomerLinks)
        .WithOne(x => x.Child)
            .HasForeignKey(x => x.Customer);

結果是:

“Customer”不能用作實體類型“CustomerLink”的屬性,因為它被配置為導航。

所以我想也許我正在倒退並且需要向 CustomerLink 定義添加一些東西所以我嘗試了以下操作:

modelBuilder.Entity<CustomerLink>()
    .HasOne(x => x.Child)
        .HasForeignKey(x => x.CustomerId);

但這告訴我:

“ReferenceNavigationBuilder<CustomerLink, Customer>”不包含“HasForeignKey”的定義,並且找不到接受類型為“ReferenceNavigationBuilder<CustomerLink, Customer>”的第一個參數的可訪問擴展方法“HasForeignKey”(您是否缺少 using 指令或裝配參考?)

我已經嘗試了一些我現在不記得的其他事情,所以我很抱歉提出這樣一個菜鳥問題(但我是 EF 的菜鳥)但是如果有人可以提供幫助,我將不勝感激,因為我確信我我要么在做一些愚蠢的事情,要么錯過了一些明顯的事情。 我花了前 4 個小時嘗試為 EF6 而不是 EF6-core 記錄的解決方案,然后才發現我看到的是錯誤的答案。 :-(

編輯 =========================================

首先,讓我感謝所有如此迅速提供幫助的人。 非常感謝。 包括執行的格式化。 謝謝你。

根據建議,我將模型更改為如下:


public class Customer
{
    [Key]
    public int Id {get; set;}
    [Required(ErrorMessage = "Name is required")]
    [MaxLength(100, ErrorMessage="Name cannot be longer than 100 characters")]
    public string Name {get; set;}
    public List<CustomerLink> CustomerLinks{get; set;} 
    [MaxLength(200, ErrorMessage="Create User cannot be longer than 200 characters")]
    public string CreateUser {get; set;}
    public DateTime? CreateDate {get; set;}
    [Required(ErrorMessage = "Modify User is required")]  
    [MaxLength(200, ErrorMessage="Modify User cannot be longer than 200 characters")]
    public string ModifyUser {get; set;}
    public DateTime? ModifyDate {get; set;}     
}

public class CustomerLink
{
    [Key]
    public int Id {get; set;}
    public int CustomerId {get; set;}
    [Required(ErrorMessage = "Customer is required")]
    public Customer Customer {get; set;}
    public int ChildId {get; set;}
    [Required(ErrorMessage = "Child is required")]
    public virtual Customer Child {get; set;}
    [MaxLength(200, ErrorMessage="Create User cannot be longer than 200 characters")]
    public string CreateUser {get; set;}
    public DateTime? CreateDate {get; set;}
    [Required(ErrorMessage = "Modify User is required")]  
    [MaxLength(200, ErrorMessage="Modify User cannot be longer than 200 characters")]
    public string ModifyUser {get; set;}
    public DateTime? ModifyDate {get; set;}     
}

然后我更新了我的上下文以具有以下內容

modelBuilder.Entity<CustomerLink>()
    .HasOne(l => l.Customer)
    .WithMany(c => c.CustomerLinks)
        .HasForeignKey(l => l.CustomerId);


modelBuilder.Entity<CustomerLink>()
    .HasOne(l => l.Child)
    .WithMany(c => c.CustomerLinks)
        .HasForeignKey(l => l.ChildId);     

這就是我認為發送給我的文檔告訴我要做的,但是當我嘗試生成遷移時我現在得到以下信息(順便說一句,我首先使用代碼來對抗 SQL Server)

無法在“Customer.CustomerLinks”和“CustomerLink.Child”之間創建關系,因為“Customer.CustomerLinks”和“CustomerLink.Customer”之間已經存在關系。 導航只能參與單一關系。 如果要覆蓋現有關系,請先在“OnModelCreating”中的導航“CustomerLink.Child”上調用“忽略”。

我的數據庫架構看起來像這樣

CREATE TABLE [QMR].[Customers](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [CreateUser] [nvarchar](200) NULL,
    [CreateDate] [datetime2](7) NULL,
    [ModifyUser] [nvarchar](200) NOT NULL,
    [ModifyDate] [datetime2](7) NULL,
 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, 
    STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, 
    OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF
    ) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [QMR].[CustomerLinks](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [CustomerId] [int] NOT NULL,
    [ChildId] [int] NOT NULL,
    [CreateUser] [nvarchar](200) NULL,
    [CreateDate] [datetime2](7) NULL,
    [ModifyUser] [nvarchar](200) NOT NULL,
    [ModifyDate] [datetime2](7) NULL,
 CONSTRAINT [PK_CustomerLinks] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, 
    STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, 
    OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF
    ) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [QMR].[CustomerLinks]  WITH CHECK ADD  CONSTRAINT [FK_CustomerLinks_Customers_ChildId] FOREIGN KEY([ChildId])
REFERENCES [QMR].[Customers] ([Id])
GO

ALTER TABLE [QMR].[CustomerLinks] CHECK CONSTRAINT [FK_CustomerLinks_Customers_ChildId]
GO

ALTER TABLE [QMR].[CustomerLinks]  WITH CHECK ADD  CONSTRAINT [FK_CustomerLinks_Customers_CustomerId] FOREIGN KEY([CustomerId])
REFERENCES [QMR].[Customers] ([Id])
GO

ALTER TABLE [QMR].[CustomerLinks] CHECK CONSTRAINT [FK_CustomerLinks_Customers_CustomerId]
GO

如果這不夠詳細,我深表歉意,但我不確定還要顯示什么。 我假設我沒有遵循良好的說明或文檔,但此時我有點游泳。 還有什么建議嗎?

EF 無法決定它必須為以下兩個屬性使用什么 FK(在數據庫端):

public Customer Customer { get; set; }
        
public virtual Customer Child { get; set; }

並補充@IvanGechev 在他的評論中所說的內容:

將 FK 手動添加到您的模型(在 CustomerLink 一側),以便 EF 知道哪個列引用哪個導航屬性。 當有兩個導航屬性時,EF 默認為隱式 FK 名稱添加 1 后綴。

如果已存在同名屬性,則影子屬性名稱將以數字作為后綴。

來源: https ://learn.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key#no-foreign-key-property

鏈接的源還應該解釋如何正確配置此類導航屬性,例如使用HasForeignKey


我猜你的具體情況的答案歸結為 - 數據庫模式實際上是什么樣的? 你有代碼優先還是數據庫優先?


我認為還有其他事情正在發生 - 請不要將 IEnumerable 用於 1..* 導航屬性 - 使用IReadOnlyCollectionList之類的東西。 這可能是您出錯的原因 - 我不確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM