c# - EF6 忽略实体类中的 [Table] 和 [Column]

标签 c# sql-server entity-framework ef-code-first entity-framework-6

我使用 EF6 数据库优先工具从我的数据库中为 2 个表生成 C# 类,然后(按照帮助我完成该步骤的博客文章中的建议)将生成的 .cs 文件复制到一个新项目中。我对这些类进行了一些编辑,以支持我的 C# 代码中的合理名称。这是其中一个类的片段,其中“LongTableName”替换了数据库中使用的一个奇怪的长名称。

namespace RidesData
{
    [Table("LongTableName")]
    public partial class PhoneData
    {
        [Key]
        [Column("LongTableNameID")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [Column("LongTableNameAccountID")]
        public int AccountID { get; set; }
        // more fields
    }
}

我无法控制表名,也无法控制许多列名以表名作为前缀的事实。但我认为,尽管如此,EF6 中的 Code First 思想应该让我使用合理的类名和字段名。 (Database First 代码生成器在将代码添加到 OnModelCreating 以指定与 C# 字符串数据对应的列均不使用 Unicode 方面做得很好。)

我的模型(由 EF6 工具生成并继承自 DbContext)包括(在我重命名之后)

   public virtual DbSet<PhoneData> PhoneRecs { get; set; }

当我创建一个 PhoneData 实例、填充它并执行操作时,我认为一切都会好起来的

   Model.PhoneRecs.Add(phoneData);

但是当我运行代码时发生的第一件事——远在调用 SaveChanges() 之前——是 EF 为这两个代码生成了 CREATE TABLE 语句表格;与上面代码片段对应的表被命名为 PhoneDatas(未使用指定的表名)并且列名与类中的字段名相同(不是 Column(...) 属性中指定的名称)。

当然不需要创建我指定的表。 EF 只需要理解我想使用我通过属性指定的表名和列名。

我没想到显式 Code First 属性会失败。有谁知道为什么这不是我想要的,或者如何解决它? (我是否必须做一些事情来指定 OnModelCreating 中的表和列名称以及 - 或者代替 - 属性?)

请注意,我将这些类复制到的项目以前从未“见过”数据库。查看数据库后,工具不会留下任何“模型”的痕迹。此外,我希望我尝试将内容保留在 .Net 4.0 上(避免在此代码中转到 4.5)并不重要。

如有任何帮助,我们将不胜感激。

最佳答案

我也不是 DataAnotations 的忠实粉丝。使用 EntityTypeConfiguration。它为您提供了我认为您正在寻找的命名灵 active 。

例子。

public class PhoneData
 {
   public int ID {get;set;}
   public string SomeProperty {get;set;}
 }

public class PhoneDataMap : EntityTypeConfiguration<PhoneData>
    {
        public PhoneDataMap()
        {
            ToTable("WhatEverYou_Want_to_call_this");
            HasKey(m => m.Id);
            Property(m => m.SomeProperty).HasColumnName("whatever").IsRequired();
            //etc.
        }
    }

然后在您的 ModelCreating 上添加

modelBuilder.Configuration.Add(new PhoneDataMap());

附带说明一下,如果您在表名的复数化方面遇到问题,您也可以将其添加到 OnModelCreating

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

关于c# - EF6 忽略实体类中的 [Table] 和 [Column],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24918406/

相关文章:

c# - #botframework 依赖注入(inject)

sql-server - 全文搜索问题

node.js - Sequelize 无法通过网络连接到 SQL Server

sql - INSERT SELECT 语句和回滚 SQL

c# - 使用 GraphDiff 更新多对多关系会导致错误

c# - 如何检查变量的类型是否与存储在变量中的类型匹配

c# - 使用 ILMerge 后应用程序停止记录

.net - 如何让 Entity Framework 在我新创建的实体上初始化集合?

entity-framework - 无法解析符号“ForSqliteHasDefaultValueSql”

c# - 没有 Entity Framework 但存储过程的 ASP.Net Core 2.0 API OData