在数据库中,我们不允许进行大的更改,我们在表之后的其他表中(不相关的列隐藏在[其他一些列...]后面):
主
Id, [some other columns...]
表1
Id, [some other columns...]
表2
Id, [some other columns...]
参考
Id, MasterId, TableName, ForeignId
我们正在使用 EF6 (代码优先,数据注释首选)来访问数据库。
现在我们希望能够在我们的代码中导航,例如通过" master.References.First()。ReferenceRow"到引用的表。在这种情况下" ReferenceRow"可能是一个导航属性,我们需要在"映射"后面添加一些额外的自定义逻辑,比如"看看值TableName,如果Table1从 Table1获取行其中Id = ForeignId,否则如果 Table2 ..."列 TableName 将类似于TPH中的discriminator列。我认为EF中的scanario没有开箱即用的解决方案,但是可以将这个逻辑添加到导航属性吗?
当然,我们可以创建一个抽象类" RefereceTable"并让所有可以引用的表继承它。但在这种情况下,TPH会创建很多列。 TPC和TPT不会给我们提供我们想要的性能。这就是为什么我们不能使用theese继承类型来解决这个问题的原因。该表的唯一公共列也是Id列。
这就是我们想知道的原因:有没有办法在导航属性后面实现自定义逻辑来解决我们的问题?
答案 0 :(得分:0)
根据您的评论,您无需担心Table1-Row的ID。 EF将为您处理它。您需要做的就是构造实体的层次结构并调用一次SaveChanges。
var master = _context.Master.Create();
master.property1 = "xyz";
var table1Row = _context.Table1.Create();
table1Row.property1 = "abc";
var referenceRow1 = _context.Reference.Create();
referenceRow1.MasterId = master.Id;
referenceRow.TableRow1Id = table1Row.Id;
_context.SaveChanges();
这些方面的东西应该是你想要达到的目标。