我在关系的一侧有三个不同的定义良好的实体,Foo, Bar, Baz, 和一个单独的实体,这些都需要在另一侧绑定,我们称之为LogEntry。就 sql 而言,我的关系有效,但我不知道如何在 中定义它DbContext modelBuilder并让导航道具在使用.Include().
要求:
LogEntry必须与一个Foo,Bar, 或Baz
Foo,Bar, 或Baz可能只与零或一LogEntry有关
所需用途:
我想有一个导航属性两种方式。
.Include(x => x.LogEntry)...检索所有Foo, Bar, 或Bazs时
和
db.LogEntries.Include(x => x.Foo).Include(x => x.Bar).Include(x => x.Baz)...
我试过的:
我们使用代码优先,但我们从.sql脚本生成表。
--LogEntry.sql rough details
LogEntry UNIQUEIDENTIFIER NONCLUSTERED PRIMARY KEY NOT NULL,
FooID UNIQUEIDENTIFIER NULL
BarID UNIQUEIDENTIFIER NULL
BazID UNIQUEIDENTIFIER NULL
-- Other Fields, etc...
-- CONSTRAINT FKs to the Foo,Bar,Baz tables
-- CONSTRAINT CHECK (FooID IS NOT NULL AND BarID IS NULL AND BazID IS NULL or ...etc)
-- to make sure each LogEntry is related to one entity regardless of type
-- CONSTRAINT UNIQUE for each Foo, Bar, Baz ID that isn't null
我尝试了几种不同的方法来定义与 的关系DbContext ModelBuilder,但是我尝试过的任何方法都没有在.Include()ed 时填充 nav 道具。
// Example
modelBuilder.Entity<Foo>
.HasOptional(f => f.LogEntry)
.WithRequired(l => l.Foo);
第一种方法是在每个Foo,Bar或上放置一个可为空的 FKBaz并在 , 或 nav 属性上放置 Lists of Foo,Bar或Baznav props LogEntry。我们将只依靠代码永远不会添加超过一个Foo,Bar或。这使得实体关系变得微不足道,但与它们的使用方式不匹配,并且会导致开发人员混淆。另一个问题是我们无法对跨 、 或 表的 FK实施唯一检查。BazLogEntryLogEntryFooBarBaz
总之:
有没有办法在实体框架中定义这种关系以获得双方的工作导航属性?