代码之家  ›  专栏  ›  技术社区  ›  MaxOctane

在实体框架中,是否可以将列自动映射到实体属性?ID=>[表名]ID

  •  3
  • MaxOctane  · 技术社区  · 13 年前

    我想在实体类中使用.Id作为唯一Id,但我们的dba希望在数据库表中使用[tablename]Id。有没有一种方法可以让实体框架自动进行映射,而不必为每个实体创建新的映射文件?

    2 回复  |  直到 13 年前
        1
  •  4
  •   Brad Christie    13 年前

    只要我正确理解你,你就会有这样的东西:

    public class Foo
    {
        public Int32 ID { get; set; }
        // ...
    }
    public class Bar
    {
        public Int32 ID { get; set; }
        // ...
    }
    

    而且,不需要太多努力(或创建多个 entityTypeConfiguration<T> 模型),您希望得到以下结果:

    Current Mapping                  Desired Mapping
    
    [Foo]                            [Foo]
      ID                               FooID
      ...                              ...
    [Bar]                            [Bar]
      ID                               BarID
      ...                              ...
    

    为此,存在一些方法(取决于您使用的EF版本)。话虽如此,一些平易近人的策略:

    列属性

    您可以访问每个实体模型,并使用 ColumnAttribute 这告诉告诉,尽管 我们 命名列,我们想要 其他的东西 成为数据库中的名称。例如

    public class Foo
    {
        [Column("FooID")]
        public Int32 ID { get; set; }
        // ...
    }
    public class Foo
    {
        [Column("BarID")]
        public Int32 ID { get; set; }
        // ...
    }
    

    这里唯一的问题是,您现在要访问每个模型并添加属性。

    OnModel创建&Fluent映射

    另一种方法是进行映射,但将所有映射都保存在一个地方。这个 OnModelCreating 这类活动非常适合。

    public class MyDbContext : DbContext
    {
        public Dbset<Foo> Foos { get; set; }
        public DbSet<Bar> Bars { get; set; }
    
        protected override void OnmodelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Foo>()
                .Property(x => x.ID).HasColumnName("FooID");
            modelBuilder.Entity<Bar>()
                .Property(x => x.ID).HasColumnName("BarID");
        }
    }
    

    同样,这里的问题是您要为每个实体创建一个配置。

    自定义约定

    从EF6开始,您可以使用使事情变得更容易的自定义约定(包括开发您自己的约定 ID = TableNameID ). 不幸的是,我没有时间写一个例子,但 docs 非常有启发性。

        2
  •  3
  •   J.W.    13 年前

    根据MSDN, both way 应该有效。

    主键检测不区分大小写。公认的命名模式 是,按优先级排序:“Id”[类型名称]Id