首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架5和TPT设计问题

实体框架5和TPT设计问题
EN

Stack Overflow用户
提问于 2012-12-07 08:00:35
回答 1查看 172关注 0票数 2

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

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

我的数据库如下所示:

感谢大家的投票,编辑添加了我的图片:

该项目的POCO如下所示:

代码语言:javascript
复制
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();

}

对于位置元素:

代码语言:javascript
复制
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; }
}

关于这一点:

代码语言:javascript
复制
[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设置为标识列,但事实并非如此。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-08 01:00:17

正如上面的@leppie所指出的,我必须用注释表(“LocationElements”)来装饰LocationElement类,这立即修复了这个问题。我对EF的理解是,对于TPT设计的基表,这不是必需的,而且我还没有在项目/ ScientificLicence对上这样做(也就是说,我只装饰了ScientificLicence对象)。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13754839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档