代码之家  ›  专栏  ›  技术社区  ›  Chris Dunaway

获取Sql错误:列名“PrimaryContact_ContactID”无效

  •  1
  • Chris Dunaway  · 技术社区  · 7 年前

    我首先使用实体框架数据库。当我查询一个实体并请求包含一个相关的实体时,我得到一个错误:无效的列名'PrimaryContact_ContactID'。在调用 Load 方法。

    Enterprise 实体,并让它包括 Company

    (这是一个简化的示例,它复制了异常)

    以下是我的实体类:

    //Enterprise
    public class Enterprise
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyID { get; set; }
    
        public virtual Company Company { get; set; }
    }
    
    //Company
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int PrimaryContactId { get; set; }
    
        public virtual CompanyContact PrimaryContact { get; set; }
    }
    
    //CompanyContact class
    public class CompanyContact
    {
        public int ContactID { get; set; }
        public string Name { get; set; }
    }
    

    DataContext 班

    public class DataContext : DbContext
    {
        public DbSet<Enterprise> Enterprises { get; set; }
        public DbSet<Company> Companies { get; set; }
        public DbSet<CompanyContact> CompanyContacts { get; set; }
    
        public DataContext(string connStrName = nameof(DataContext)) : base($"Name={connStrName}")
        {
            Database.SetInitializer<DataContext>(null);
            base.Configuration.ProxyCreationEnabled = false;
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    
            modelBuilder.Entity<Enterprise>().HasKey(pk => pk.Id);
            modelBuilder.Entity<Enterprise>().Property(i => i.Id)
                                             .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    
            modelBuilder.Entity<Company>().HasKey(pk => pk.Id);
            modelBuilder.Entity<Company>().Property(i => i.Id)
                                          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<Company>().HasOptional(t => t.PrimaryContact);
    
            modelBuilder.Entity<CompanyContact>().HasKey(pk => pk.ContactID);
            modelBuilder.Entity<CompanyContact>().Property(i => i.ContactID)
                                                 .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    
        }
    }
    

    这是 Main

        static void Main(string[] args)
        {
            try
            {
                using (var ctx = new DataContext())
                {
                    ctx.Database.Log = Console.Write;
    
                    var ent = ctx.Enterprises.FirstOrDefault(e => e.Id == 1);
    
                    //Exception thrown on this line.
                    ctx.Entry(ent).Reference(e => e.Company).Load();
    
                    Console.WriteLine(ent);
                    Console.WriteLine(ent.Company);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
    
            Console.ReadLine();
        }
    

    我打开了EF日志,下面是运行代码的输出(为了缩短问题,我没有包括完整的堆栈跟踪):

    Opened connection at 2/22/2019 3:43:02 PM -06:00
    SELECT TOP (1)
        [Extent1].[Id] AS [Id],
        [Extent1].[Name] AS [Name],
        [Extent1].[CompanyID] AS [CompanyID]
        FROM [dbo].[Enterprise] AS [Extent1]
        WHERE 1 = [Extent1].[Id]
    -- Executing at 2/22/2019 3:43:02 PM -06:00
    -- Completed in 85 ms with result: SqlDataReader
    
    Closed connection at 2/22/2019 3:43:02 PM -06:00
    Opened connection at 2/22/2019 3:43:02 PM -06:00
    SELECT
        [Extent1].[Id] AS [Id],
        [Extent1].[Name] AS [Name],
        [Extent1].[PrimaryContactID] AS [PrimaryContactID],
        [Extent1].[PrimaryContact_ContactID] AS [PrimaryContact_ContactID]
        FROM [dbo].[Company] AS [Extent1]
        WHERE [Extent1].[Id] = @EntityKeyValue1
    -- EntityKeyValue1: '1' (Type = Int32, IsNullable = false)
    -- Executing at 2/22/2019 3:43:02 PM -06:00
    -- Failed in 68 ms with error: Invalid column name 'PrimaryContact_ContactID'.
    
    Closed connection at 2/22/2019 3:43:02 PM -06:00
    System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'PrimaryContact_ContactID'.
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrap
    

    Database Diagram

    我肯定我错过了一些基本的东西,但经过大量的搜索,我还是没能解决我的问题。

    0 回复  |  直到 7 年前
        1
  •  3
  •   Leonel Sanches da Silva    7 年前

    你需要强制执行 [ForeignKey] 不遵循EF默认约定的导航属性的属性:

    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int PrimaryContactId { get; set; }
    
        [ForeignKey(nameof(PrimaryContactId))]
        public virtual CompanyContact PrimaryContact { get; set; }
    }
    

    否则,EF将无法识别您的 PrimaryContactId 属性作为的列 PrimaryContact 它会创建另一列, PrimaryContact_ContactID

        2
  •  0
  •   Mechandrius    6 年前

    我也犯了同样的错误,并在我的命名约定中寻找解决方案。我尝试了所有可能的惯例和伎俩,只是为了找出问题的起因是其他原因。

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {   
        var dbi = new SqliteDropCreateDatabaseWhenModelChanges<LogsContext>(modelBuilder);
        DB.SetInitializer<LogsContext>(dbi);
        base.OnModelCreating(modelBuilder);
    }
    

    我希望这可以节省一些时间来定位他们的错误。