考虑下表。记录可以包含相关的原始,而记录只能是另一条记录的原始。
create table dbo.foo
(
id int identity
constraint pk primary key
,name nvarchar(max) not null
,original int null
constraint fk_original foreign key references dbo.foo(id)
)
create unique index ix_original on dbo.foo(original) where original is not null
insert into dbo.foo values('bar1', null)
insert into dbo.foo values('baz1', null)
insert into dbo.foo values('bar2', 1)
insert into dbo.foo values('baz2', 2)
--insert into dbo.foo values('baz3', 2) /* violates the unique constraint */
select * from dbo.foo
/*
id name original
-- ---- --------
1 bar1 NULL
2 baz1 NULL
3 bar2 1
4 baz2 2
*/
生成EDMX会创建一个具有2个导航属性的实体:
foo1
是一系列记录,其中记录为原始记录。 foo2
是对原文的引用。以下代码演示了这一点:
var items = context.foo.ToList();
foreach (var item in items)
{
Console.WriteLine("{0}\t{1}\t{2}", item.id, item.name, item.original);
foreach (var related in item.foo1)
{
Console.WriteLine("related\t{0}", related.id);
}
if (item.foo2 != null)
{
Console.WriteLine("original\t{0}", item.foo2.id);
}
Console.WriteLine();
}
1 bar1 related 3 2 baz1 related 4 3 bar2 1 original 1 4 baz2 2 original 2
因此即使我指定记录只能是另一条记录的原始,但EF坚持认为这应该是一个集合。当我尝试将foo1
更改为 0..1(零或一个)时,我收到此错误:
运行转换:Multiplicity在角色'foo1'中无效 关系'fk_original'。因为依赖角色属性是 不是关键属性,多重性的上限 依赖角色必须是*。
是否需要进行任何其他更改,我是否做出了错误的假设,或者EF无法处理这种情况?