2011-06-14 81 views
3

我有兩個類,ThreadItem和Inquiry。CodeFirst EF 4.1繼承 - 重命名PK/FK

public class ThreadItem 
{ 
    [Key] 
    public int Id { get; set; } 

    public DateTime Created { get; set; } 
} 

public class ThreadItemMapping : EntityTypeConfiguration<ThreadItem> 
{ 
    public ThreadItemMapping() 
    { 
     Property(a => a.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).HasColumnName("ThreadItemId"); 
    } 
} 

[Table("Enquiry")] 
public class Enquiry : ThreadItem 
{ 
    public string Comment { get; set;} 
} 

現在,這工作,而不是一個單一的問題。我有一個[ThreadItem]表和一個[Inquiry]表。我的查詢表有一個映射到ThreadItem的PK/FK,這是我所需要的。但是,我想重命名該列。

目前它是[ThreadItemId],根據ThreadItemMapping類。我想重新命名它[EnquiryId]。我明白它被稱爲[ThreadItemId]是有道理的,這實際上更像是一個'可能'的問題。

任何想法?

乾杯, d

+0

有趣的問題! EF 4.0實際上支持在Table-Per-Type繼承中將任意列名映射到基類的key屬性。 (你甚至可以在設計器中映射它。)但是它看起來DbContext API沒有選項來配置這個場景。鍵列名稱在所有派生類中必須相同。據我可以看到至少... – Slauma 2011-06-14 17:04:20

回答

2

http://msdn.microsoft.com/en-us/library/gg197525%28v=vs.103%29.aspx

我不是說不能做,但這些例子不顯示正在做這樣的事情。

但是,如果您使用Fluent-API約定,則非常簡單。

你的POCO定義:

public class BaseClass 
{ 
    public int Id {get; set;} 
} 

public class DerivedClass : BaseClass 
{ 
    public string Data {get; set;} 
} 

配置映射到數據庫:

public class BaseConfiguration : EntityTypeConfiguration<BaseClass> 
{ 
    public BaseConfiguration() 
{ 
    HasKey(k => k.Id); 
    Property(p => p.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired(); 
} 
} 

public class DerivedConfiguration : BaseConfiguration 
{ 
    public DerivedConfiguration() 
{ 
    Property(p => p.Id).HasColumnName("BaseClassId"); 
} 
} 

把他們放在一起

​​

所以你實例化一個MyContext通過你的連接字符串中並且配置告訴EF如何與表相關聯。

+0

嗯,不完全是我想要的,我想重命名爲查詢表的列,只會有比從ThreadItem繼承更多的類。 – 2011-06-14 13:11:31

+0

對不起,你是對的,我打錯了桌子 - 但原理是一樣的。 – 2011-06-14 13:12:44

+0

嗯。你知道我在配置上更好。在配置文件設置中(我認爲它更強大),你可以使用Property(p => ThreadItemId = p.Id);覆蓋列名稱。 – 2011-06-14 13:17:33