2010-08-03 48 views
3

我有兩個collumns舊的數據庫,我想將它們映射爲1點的ID是可能EF代碼第一 - 複合鍵

例如

public class Product 
{ 
public string ProductID {get;set;} 
public string ShortDescription {get;set;} 
public string UserName {get;set;} 
} 

然後我ModelBinder的看起來像這樣

modelBinder.Entity<Product>(). 
HasKey(p=>p.ProductID) 
.MapSingle(product => 
new { 
colShotDesc = product.ShortDescription, 
colUser = product.UserName 
} 
).ToTable("Products"); 

我需要什麼會像在映射 的ProductID = SHORTDESCRIPTION +用戶名... 因爲這兩個collumns共享的uniq ue key contraint ...

不知道這是否使得sens,但任何建議將是偉大的... 請不要問關於數據庫設計=>這是這樣的,不應該改變。這就是爲什麼我認爲EF代碼優先可以幫助我(希望交叉手指)... ,因爲它看起來像分貝沒有得到PK定義只是唯一的關鍵限制...

無論如何... 幫助將是了不起的..

回答

0

實際上,你想映射一個概念屬性到幾個存儲列。 有一個代碼將列中的值連接到屬性,到目前爲止非常好。
但讓我們想象一下向上下文添加新實體的過程。 因此,我們爲該物業設定了價值。 EF應該如何知道將該屬性的值寫入兩列的規則?
不確定這種情況是否可能實現。

+0

是的我同意它不是那麼幹淨,但這是我正在面對的分貝。由於這兩列在數據庫級別上有一個唯一的約束,因此應該設置它們。我也使用驗證來確保它們已被設置。 我希望我的解決方案在代碼中更清晰,因此我正在查找複合產品ID。我如何在代碼優先的情況下組裝我的連接字段? – 2010-08-05 08:12:02

11

聽起來就像你想要一個複雜的類型,並希望通過在屬性名稱的末尾使用附加ID的約定將複雜類型識別爲鍵。

EF CF此時無法做到這一點。

您可以通過Key屬性或FluentAPI告訴EF CF有關組合鍵的信息。

數據註釋:

public class Product 
{ 
    [Key, Column(Order=0)] 
    public string ShortDescription {get;set;} 
    [Key, Column(Order=1)] 
    public string UserName {get;set;} 
} 

流利的API:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Product>() 
       .HasKey(p=> new{p.ShortDescription, p.UserName}); 
} 

您可以創建一個複雜的類型,你可以在你的代碼中使用的工作越多,你希望你的代碼在概念上的工作方式。

public class Product 
{ 
    public ProductID Key {get;set;} 
} 

public class ProductID 
{ 
    public string ShortDescription {get;set;} 
    public string UserName {get;set;} 
} 

然後用流利的API映射它:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.ComplexType<ProductID>() 
       .Property(p=>p.ShortDescription) 
       .HasColumnName("ShortDescription") 
       .Property(p=>p.UserName) 
       .HasColumnName("UserName"); 
} 

或者,如果你想使用數據註釋:

[ComplexType] 
public class ProductID 
{ 
    [Column("ShortDescription")] 
    public string ShortDescription {get;set;} 
    [Column("UserName")] 
    public string UserName {get;set;} 
} 

您必須指定列名或配置將假定列名是ProductID_ShortDescription ....

Here's some more info on Complex Types.