簡體   English   中英

EF Core:數據庫第一次轉換:外鍵錯誤列

[英]EF Core : Database First Conversion : Foreign Key wrong column

我試圖通過將現有的應用程序從帶有EF6的.net 4.6.2遷移到帶有EF Core的.net Core 2.2來接受asp.net核心。

鑒於我有一個現有的數據庫,我從數據庫生成模型以開始。 我的所有列名都使用下划線,外鍵居住的地方都以表名開頭。

使用EF Core,它堅持我的代碼列名稱從Manager_UserLogin_ID更改為ManagerUserLoginId,這很好,我可以通過我的代碼

當我嘗試使用include查詢UserLogin和Manager時出現問題

__DB.UserLogin.Include(x=>x.Manager).First();

嘗試運行的查詢嘗試在Manager查詢中包含UserLoginId列以及Manager_UserLogin_ID列。

課程如下

public partial class Manager
{
    public int ManagerId { get; set; }
    public int ManagerCompanyId { get; set; }
    public int ManagerUserLoginId { get; set; }
    public virtual Company ManagerCompany { get; set; }
    public virtual UserLogin ManagerUserLogin { get; set; }
}

public partial class UserLogin
{
    public UserLogin()
    {
        Manager = new HashSet<Manager>();
    }

    public int UserLoginId { get; set; }
    public string FullName { get; set; }

    public virtual ICollection<Manager> Manager { get; set; }
}

public partial class Company
{
    public Company()
    {
        Manager = new HashSet<Manager>();
    }

    public int CompanyId { get; set; }
    public string CompanyName { get; set; }

    public virtual ICollection<Manager> Manager { get; set; }
}

EF Core上下文具有以下內容

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

    modelBuilder.Entity<Company>(entity =>
    {
        entity.HasKey(e => e.CompanyId).HasName("PK_Company_ID");
        entity.Property(e => e.CompanyId).HasColumnName("Company_ID");

        entity.Property(e => e.CompanyName)
            .IsRequired()
            .HasColumnName("Company_Name")
            .HasMaxLength(200);

    modelBuilder.Entity<Manager>(entity =>
    {
        entity.HasKey(e => e.ManagerId)
            .HasName("PK_Manager_ID")
            .ForSqlServerIsClustered(false);

        entity.HasIndex(e => new { e.ManagerCompanyId, e.ManagerUserLoginId })
            .HasName("IX_Manager")
            .IsUnique()
            .ForSqlServerIsClustered();

        entity.Property(e => e.ManagerId).HasColumnName("Manager_ID");

        entity.Property(e => e.ManagerCompanyId).HasColumnName("Manager_Company_ID");

        entity.Property(e => e.ManagerUserLoginId).HasColumnName("Manager_UserLogin_ID");

        entity.HasOne(d => d.ManagerCompany)
            .WithMany(p => p.Manager)
            .HasForeignKey(d => d.ManagerCompanyId)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("FK_Manager_Company_ID");

        entity.HasOne(d => d.ManagerUserLogin)
            .WithMany(p => p.Manager)
            .HasForeignKey(d => d.ManagerUserLoginId)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("FK_Manager_UserLogin_ID");
        });

    modelBuilder.Entity<UserLogin>(entity =>
    {
        entity.HasKey(e => e.UserLoginId).HasName("PK_UserLogin_ID");
        entity.HasIndex(e => e.UserLoginUid)
            .HasName("IX_UserLogin_UID")
            .IsUnique();

        entity.Property(e => e.UserLoginId).HasColumnName("UserLogin_ID");

        entity.Property(e => e.FullName)
            .IsRequired()
            .HasColumnName("Full_Name")
            .HasMaxLength(300);

        entity.Property(e => e.UserLoginUid).HasColumnName("UserLogin_UID");
    });

這是來自Sql Profiler的查詢



    exec sp_executesql N'SELECT [x.Manager].[Manager_ID], [x.Manager].[Manager_Company_ID], [x.Manager].[Manager_UserLogin_ID], , [x.Manager].[UserLoginId]
    FROM [Manager] AS [x.Manager]
    INNER JOIN (
        SELECT TOP(1) [x0].[UserLogin_ID]
        FROM [UserLogin] AS [x0]
        WHERE [x0].[UserLogin_UID] = @____UID_0
        ORDER BY [x0].[UserLogin_ID]
    ) AS [t] ON [x.Manager].[Manager_UserLogin_ID] = [t].[UserLogin_ID]
    ORDER BY [t].[UserLogin_ID]',N'@____UID_0 uniqueidentifier',@____UID_0='F55C9BBB-C7FF-4C87-B834-B2FE6B0F0B17'

請有人幫我診斷並解決這個問題嗎?

我昨天嘗試了一些事情,我改變了propertyNames很好:

更改public int ManagerUserLoginId { get; set; } public int ManagerUserLoginId { get; set; } public int ManagerUserLoginId { get; set; }public int Manager_UserLogin_Id { get; set; } public int Manager_UserLogin_Id { get; set; } public int Manager_UserLogin_Id { get; set; }和除去entity.Property(e => e.Manager_UserLogin_Id).HasColumnName("Manager_UserLogin_ID"); 來自你的modelBuilder。

這是一個quickFix ..背后的問題似乎是一個更大的問題。 我將創建一個新的數據庫,其中為您創建了相同的配置/類VS.

  • 創建一個新項目
  • 添加具有新DB-Name的連接字符串
  • 粘貼到您的課程中
  • 創建一個新的DbContext
  • 轉到包管理器控制台並粘貼add-migration InitialMigration

Ef Core將根據您的模型和配置創建遷移以創建新數據庫。 注意 :確保您的connectionString不指向任何現有數據庫。 如果執行遷移,則會丟失任何現有數據庫中的數據!

  • 如果您完全確定update-database指向新的數據庫粘貼

之后,您可以將新數據插入TestDB以檢查問題所在。

暫無
暫無

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

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