2011-06-14 104 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