2013-08-20 83 views
2

我想在我的實體類中使用.Id作爲唯一ID,但是我們的dba想要在數據庫表中使用[tablename] Id。有沒有一種方法可以使Entity Framework自動創建此映射,而無需爲每個實體創建新的映射文件?在Entity Framework中,是否可以將列自動映射到實體屬性? ID => [tablename] ID

+0

您是否考慮在上下文中使用流利的映射(每個ID一行)太多?還有'ColumnAttribute',但這也意味着打開每個實體並裝飾該屬性。 –

+0

你可否詳細說明如何做到這一點?除了爲實體創建映射並將其添加到modelBuilder配置之外,我不知道其他任何方式。 – MaxOctane

回答

3

只要我理解正確的話,你有這樣的:

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的版本,你全光照G)。隨着中說,一些平易近人的戰術:

ColumnAttribute

您可以訪問每一個實體模型,裝飾用ColumnAttribute ID屬性。這告訴EF,儘管我們將命名爲該列,但我們想要其他的成爲數據庫中的名稱。例如

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

這裏唯一的問題是,你現在要去每個模型,並添加屬性。

OnModelCreating &流利的映射

另一種方法是做映射,但保持在同一個地方。 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非常有啓發性。

+1

這是完美的!我使用的是代碼優先的方法,因此添加列屬性是完美的。謝謝! – MaxOctane

2

根據MSDN,both way應該工作。

主鍵檢測不區分大小寫。公認的命名模式 是,按優先順序:「ID」 [類型名稱]編號

+0

我不認爲這是問題(除非我錯誤閱讀)。我認爲他們希望保留'ID'並將其保存爲'TableNameID'(但不需要單獨修飾/配置每個實體)。[或者至少我是這樣讀的] –

相關問題