2016-09-15 41 views
0

如何在父對象中使用字段在值對象中創建複合主鍵? valueobject在數據庫中沒有自己的表,我希望這兩個道具插入到父表中。實體框架 - 從值對象創建複合PK

即。

實體

public class Parent 
{ 
    public string Name { get;set; } 
    public MyValueObject MyValueObj { get;set; } 
} 

public class MyValueObject 
{ 
    public int Id { get;set; } 
    public int SSN { get;set; } 
} 

的DbContext父

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Parent>().Property(new { p.MyValueObj.Id, p.MyValueObj.SSN}).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

    base.OnModelCreating(modelBuilder); 
} 

我想父表如下所示:

Composite PK 
----------- 
Id  SSN   Name 
1  000000  Mikael 
+0

你可以把你的模型的代碼? – Sampath

+0

@Sampath我現在添加了模型。 – Henrik

+0

爲什麼你需要一個值對象? – Sampath

回答

0

如果你可以使用繼承則SH烏爾德這個樣子:

public class Parent : MyValueObject 
{ 
    public string Name { get;set; } 
} 

public class MyValueObject 
{ 
    public int Id { get;set; } 
    public int SSN { get;set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Parent>().Property(new { p.Id, p.SSN}).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

    base.OnModelCreating(modelBuilder); 
} 

之所以您的實現將無法正常工作是非常簡單的 - 實體框架只是不能改變你的複雜的對象(被設置爲屬性),以SQL領域,所以它會嘗試找到它作爲其他表中的引用對象。在我提供的代碼中,您沒有任何複雜的對象作爲屬性,因此EF將輕鬆將所有屬性映射到SQL列。

UPDATE 其實,我做了一些更多的調查,發現了一個article,說明你可以使用複雜類型。我從來沒有使用過這個(甚至看過),所以不能描述你這個問題的所有方面,但是我從文章中看到的是,這個複雜的屬性不能是可選的,所以你需要總是初始化它。此外,我只能猜想,但也許你甚至不需要來標記複雜類型作爲主鍵的各個領域,所以你應該有一些就像這樣:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Parent>().Property(p => p.MyValueObj).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

    base.OnModelCreating(modelBuilder); 
} 

不知道這會的工作,只是給它一個試試:)

+0

無法使用Complex對象並以某種方式創建組合鍵嗎?但沒有fk。 – Henrik

+0

更新了我的答案,檢查出... –