2

我首先编写代码并使用 Table-per-type 设计。将第二个对象扩展到多个表时出现以下错误:

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

我的数据库看起来像:

感谢您的投票,编辑添加我的图片: 在此处输入图像描述

该项目的 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 并尝试保存一个 ProvidedPoint 对象,我就会收到上述消息。我的第一个想法是,ProvidedPoints 上的 LocationElementID 被设置为 Identity 列,但事实并非如此。

我的问题是:通过尝试以这种方式将两个 TPT 对象链接在一起,我是否做了一些意想不到的事情?我还缺少其他东西吗?

4

1 回答 1

0

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

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

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

于 2012-12-07T17:00:17.100 回答