实体框架6 - 引用表 - 如何编写自定义导航属性逻辑?

时间:2014-09-22 09:31:48

标签: c# .net entity-framework entity-framework-6

在数据库中,我们不允许进行大的更改,我们在表之后的其他表中(不相关的列隐藏在[其他一些列...]后面):

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列。

这就是我们想知道的原因:有没有办法在导航属性后面实现自定义逻辑来解决我们的问题?

1 个答案:

答案 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();

这些方面的东西应该是你想要达到的目标。