2016-02-25 22 views
2

我有一個可怕的數據庫模型(在MySQL中,雖然我認爲不重要),別人設計,所以我堅持它,但仍要與實體框架使用它:配置許多與實體框架的一對一關係代碼首先和流暢的API

數據庫

項目

ASSET_ID* ASSET_NAME FIELDS_ID 
1   Cat   1 
2   Dog   2 
3   Fish  3 

ItemFields

ID* CUSTOMFIELD1ID CUSTOMFIELD2ID CUSTOMFIELD3ID 
1  1001    1002    1003 
2  1004    1005    1006 
3  1007    1008    1009 

ID* STRINGVAL 
1001 Meow Mix 
1002 House 
1003 5lbs 
1004 Kibble 
1005 Yard 
1006 30lbs 
1007 Fish Food 
1008 Tank 
1009 0.5 ounces 

*指示表的PK


目標

最後,我想配置的關係,這樣我就可以得到這樣的自定義數據:

Item item = GetItem(1); 
item.Food.ToString(); // Output: meow mix 
item.Place.ToString(); // Output: house 
item.Weight.ToString(); // Output: 5 lbs 

...等。但老實說,我想在這一點上解決這個:

Item item = GetItem(1); 
Item.ItemFields.CustomField3.Value // Output: 5 lbs 
Item item = GetItem(2); 
Item.ItemFields.CustomField2.Value // Output: Yard 
Item item = GetItem(3); 
Item.ItemFields.CustomField1.Value // Output: Fish Food 


解決方案迄今

到目前爲止,我有這樣的:

一比一:商品 - ItemFields

modelBuilder.Entity<Item>() 
    .HasRequired(x => x.ItemFields) 
    .WithRequiredPrincipal(y => y.Item); 

B ut將ItemFields.CustomField1ID映射到Field.ID?

是否可以使用EF代碼首先配置這樣的關係?我很困惑這是一對一還是一對多......我認爲它實際上是許多一對一(如果有意義的話)。

有什麼建議嗎?

回答

0

我可能已經想通了。我編輯ItemFields類是這樣的:

public class ItemFields 
{ 
    public int Id { get; set; } 
    public int CUSTOMFIELD1ID { get; set; } 
    public virtual Field CustomField1 { get; set; } 

然後配置這些關係:

modelBuilder.Entity<Item>() 
    .HasRequired(x => x.CustomField1) 
    .WithMany() 
    .HasForeignKey(x => x.CUSTOMFIELD01_ID); 
modelBuilder.Entity<Item>() 
    .HasRequired(x => x.CustomField2) 
    .WithMany() 
    .HasForeignKey(x => x.CUSTOMFIELD02_ID); 

而且似乎已經奏效,但說實話,我不完全理解爲什麼。我仍然希望將它們映射到更多用戶友好的類。

0

我認爲你同意,在這種情況下,我們實際上有一對多的關係:一個項目有幾個字段和表ItemFields是代理的事情。我建議您執行重構並僅創建兩個表:項目和字段。在Fields表中將添加Column Type - 類似的CUSTOMFIELD1ID(2ID,3ID)和直接引用Items表的外鍵。在Item類中添加了屬性:食物,地點和重量。他們不會被映射成列,但是當你在你的問題訪問特定字段中指定你可以用它們(看實現部分):

機型:

public enum CustomType 
{ 
    Food, 
    Place, 
    Weight 
} 

public class Item 
{ 
    public int ID { get; set; } 
    public string ASSET_NAME { get; set; } 
    public virtual ICollection<Field> fields { get; set; } 

    [NotMapped] 
    public Field Food { get { return fields == null ? null : fields.Where(x => x.Type == CustomType.Food).FirstOrDefault(); } } 
    [NotMapped] 
    public Field Place { get { return fields == null ? null : fields.Where(x => x.Type == CustomType.Place).FirstOrDefault(); } } 
    [NotMapped] 
    public Field Weight { get { return fields == null ? null : fields.Where(x => x.Type == CustomType.Weight).FirstOrDefault(); } } 
} 

public class Field 
{   
    public int ID { get; set; } 
    public string STRINGVAL { get; set; } 
    public CustomType Type { get; set; } 

    public virtual Item Item { get; set; } 
} 

表:

enter image description here 實現:

var db = new DataContext(); 
var item = db.Items.Include("fields").Where(x => x.ID == 1).First(); 
var Food = item.Food; 
var Place = item.Place; 
var Weight = item.Weight; 
+0

我喜歡這樣做。問題是我堅持現有的數據庫結構,不能改變它。相反,我需要模仿我的方式...... – Mike

相關問題