仅使用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”注册密钥。
无论如何我试着弄错了。我做错了什么?
答案 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或者最后的决定