实体框架代码首先:Table per Hierarchy:继承类型的多个集合,如何映射?

时间:2015-05-04 15:39:16

标签: c# entity-framework inheritance

有两个类握手和byteArrays从基类OpcVariables继承

for (auto x: xv) { ... // x is a copy

for (auto& x: xv) { ... // x is a reference

映射继承类型的代码优先配置(VariableType = Discriminator)。

public class ByteArray : OpcVariable {}
public class Handshake : OpcVariable {}
public abstract partial class OpcVariable {}

还有一个定义类,包含2个继承类型ByteArray和Handshake

的集合
modelBuilder.Entity<OpcVariable>()
.Map<ByteArray>(m =>  m.Requires("VariableType").HasValue("ByteArray"))
.Map<Handshake>(m => m.Requires("VariableType").HasValue("Handshake"));

代码第一(部分)配置映射以连接集合

partial class Definition : {
public virtual ICollection<ByteArray> ByteArrays { get; set; }
public virtual ICollection<Handshake> Handshakes { get; set; }
}

为了避免错误,我已将外键和相关对象从基类中删除,以及ByteArray作为握手类:

modelBuilder.Entity<Definition>()
.HasMany(e => e.Handshakes)
.WithRequired(e => e.Definition)
.HasForeignKey(e => e.DefinitionId)
.WillCascadeOnDelete(false);

modelBuilder.Entity<Definition>()
.HasMany(e => e.ByteArrays)
.WithRequired(e => e.Definition)
.HasForeignKey(e => e.DefinitionId)
.WillCascadeOnDelete(false);

我已经成功地为对象Bytearray执行了CRUD。 但是,当我尝试使用查询获得定义时

public int DefinitionId { get; set; }
public virtual Definition Definition { get; set; }

我收到以下错误

var root = (Definition)(from x in Db.Definition.Include ("ByteArrays").Include("Handshakes").Include("PlcVariable") where x.Id == id select x).First();

似乎不可能有两个基于1个外键的集合。显然,FK DefinitionId变为DefinitionId 1 (数据库中不存在),可能是因为definitionId在aswell握手中被定义为bytearray。

有关获取映射的任何建议吗?

更新Here I found a similar post

0 个答案:

没有答案