实体框架5和TPT设计问题

时间:2012-12-07 00:00:35

标签: c# entity-framework

我首先使用Table-per-type设计执行代码。当我将第二个对象扩展到多个表时,我收到以下错误:

在多个位置生成跨实体或关联共享的值。检查映射是否将EntityKey拆分为多个存储生成的列。

我的数据库看起来像:

感谢您的投票,编辑以添加我的图片: enter image description here

该项目的POCO如下:

public abstract class Project {
    public int ProjectID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<LocationElement> LocationElements { get; set; }


    public abstract string getProjectIdentifier();

}

对于位置元素:

public enum HowObtainedCodes {
    Provided = 1,
    Estimated = 2,
    Summarized = 3
}
public abstract class LocationElement {
    public int LocationElementID { get; set; }
    public int ProjectID { get; set; }
    public HowObtainedCodes HowObtainedCodeID { get; set; }
}

还有一点:

[Table("ProvidedPoints")]
public class ProvidedPoint : LocationElement {
    public double Lat { get; set; }
    public double Long { get; set; }
    public string Description { get; set; }
}

从项目(摘要)到科学许可证的链接工作正常,我的对象按预期加载/保持。此外,如果我使其不是抽象的,我可以添加LocationElements对象。只要我扩展LocationElements并尝试保存ProvidePoint对象,我就会收到上述消息。我的第一个想法是,ProvidePoints上的LocationElementID被设置为Identity列,但事实并非如此。

我的问题是:我是否通过这种方式尝试将两个TPT对象链接在一起,从而做出了意想不到的事情?我错过了别的什么吗?

1 个答案:

答案 0 :(得分:0)

如上面的@leppie所述,我必须使用注释[Table(“LocationElements”)]来装饰LocationElement类,这会立即修复问题。我对EF的理解是,这对于TPT设计的基表来说并不是必需的,而且我还没有在Project / ScientificLicence对上完成它(也就是说,我只装饰了ScientificLicence对象)。

我假设这与保存新Project对象时添加/保留LocationElements的方式有关。如果有人有任何额外的见解,我很想知道更多。

希望这有助于其他人,非常感谢leppie!