EF 4.0仅代码从抽象到派生的关联

时间:2010-02-16 05:04:52

标签: .net entity-framework inheritance entity-framework-4

仅使用EF 4.0 Code我想在抽象类和普通类之间建立关联。

我有课程'Item','ContentBase'和'Test'。

'ContentBase'是抽象的,'Test'来自它。

'ContentBase'有一个属性'Item',它链接到'Item'的实例。

因此'Test.Item'或任何派生自'ContentBase'的类都有'Item'导航属性。

在我的数据库中,Test的每个记录都有Item的匹配记录。


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

public abstract class ContentBase
{
    public int ContentId { get; set;}
    public int Id { get; set;}

    public Item Item { get; set;}
}

public class Test : ContentBase
{
    public string Name { get; set;}
}

现在有些初始代码

public void SomeInitFunction()
{

    var itemConfig = new EntityConfiguration<Item>();
    itemConfig.HasKey(p => p.Id);
    itemConfig.Property(p => p.Id).IsIdentity();
    this.ContextBuilder.Configurations.Add(itemConfig);

    var testConfig = new EntityConfiguration<Test>();
    testConfig.HasKey(p => p.ContentId);
    testConfig.Property(p => p.ContentId).IsIdentity();

    // the problem 
    testConfig.Relationship(p => p.Item).HasConstraint((p, q) => p.Id == q.Id);

    this.ContextBuilder.Configurations.Add(testConfig);  
}

这会出错: 为派生类型“Test”注册密钥。必须为根类型“ContentBase”注册密钥。

无论如何我试着弄错了。我做错了什么?

3 个答案:

答案 0 :(得分:0)

导航属性Item是在基类型级别定义的,因此模型知道基类型 - 您可以将属性添加到传递Item属性的测试类中, 将它映射到你的关系中:

public class Test : ContentBase
{
    public string Name { get; set;}
    public string TestItem { get {return Item;} ...

}

testConfig.Relationship(p => p.TestItem )

答案 1 :(得分:0)

答案 2 :(得分:0)

尝试使用超类型实体重新声明您的关系:

在ContentBase中: public virtual Item Item {get;设置;}

在测试中: public new Item Item {get;设置;}

这在我的测试项目中编译,但我没有进一步测试。 暂时还是EF5或者最后的决定