我在关系的一侧有三个不同的定义良好的实体,Foo
, Bar
, Baz
, 和一个单独的实体,这些都需要在另一侧绑定,我们称之为LogEntry
。就 sql 而言,我的关系有效,但我不知道如何在 中定义它DbContext
modelBuilder
并让导航道具在使用.Include()
.
要求:
LogEntry
必须与一个Foo
,Bar
, 或Baz
Foo
,Bar
, 或Baz
可能只与零或一LogEntry
有关
所需用途:
我想有一个导航属性两种方式。
.Include(x => x.LogEntry)...
检索所有Foo
, Bar
, 或Baz
s时
和
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
或Baz
nav props LogEntry
。我们将只依靠代码永远不会添加超过一个Foo
,Bar
或。这使得实体关系变得微不足道,但与它们的使用方式不匹配,并且会导致开发人员混淆。另一个问题是我们无法对跨 、 或 表的 FK实施唯一检查。Baz
LogEntry
LogEntry
Foo
Bar
Baz
总之:
有没有办法在实体框架中定义这种关系以获得双方的工作导航属性?