3

我正在尝试通过将我现有的应用程序从带有 EF6 的 .net 4.6.2 迁移到带有 EF Core 的 .net Core 2.2 来拥抱 asp.net 核心。

鉴于我有一个现有的数据库,我从数据库生成模型以开始移动。我所有的列名都使用下划线,并且外键所在的位置都以表名开头。

使用 EF Core,它坚持我的代码列名称从 Manager_UserLogin_ID 更改为 ManagerUserLoginId,这很好,我可以通过我的代码

当我尝试使用包含查询 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'

请问有人可以帮助我诊断并解决这个问题吗?

4

1 回答 1

0

昨天我尝试了一些事情,我对更改 propertyNames 很好:

更改public int ManagerUserLoginId { get; set; }为您的模型构建器public int Manager_UserLogin_Id { get; set; }entity.Property(e => e.Manager_UserLogin_Id).HasColumnName("Manager_UserLogin_ID");从中删除。

那是一个quickFix..背后的问题似乎是一个更大的问题。我将使用为您创建的相同配置/类 VS 创建一个新数据库。

  • 创建一个新项目
  • 添加具有新 DB-Name 的连接字符串
  • 粘贴到您的课程中
  • 创建一个新的 DbContext
  • 转到包管理器控制台并粘贴add-migration InitialMigration

Ef Core 将根据您的模型和配置创建迁移以创建新数据库。 注意:确保您的 connectionString 不指向任何现有数据库。如果您执行迁移,您将丢失任何现有数据库中的数据!

  • 如果你绝对确定你指向一个新的数据库粘贴update-database

之后,您可以将新数据插入到您的 TestDB 以检查问题出在哪里。

于 2019-01-10T12:48:44.897 回答