我首先使用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并尝试保存ProvidePoint对象,我就会收到上述消息。我的第一个想法是,ProvidePoints上的LocationElementID被设置为Identity列,但事实并非如此。
我的问题是:我是否通过这种方式尝试将两个TPT对象链接在一起,从而做出了意想不到的事情?我错过了别的什么吗?
答案 0 :(得分:0)
如上面的@leppie所述,我必须使用注释[Table(“LocationElements”)]来装饰LocationElement类,这会立即修复问题。我对EF的理解是,这对于TPT设计的基表来说并不是必需的,而且我还没有在Project / ScientificLicence对上完成它(也就是说,我只装饰了ScientificLicence对象)。
我假设这与保存新Project对象时添加/保留LocationElements的方式有关。如果有人有任何额外的见解,我很想知道更多。
希望这有助于其他人,非常感谢leppie!