如何定义零或一对零或一个自引用关系?

时间:2014-01-10 12:35:32

标签: entity-framework entity-framework-6 ef-database-first

考虑下表。记录可以包含相关的原始,而记录只能是另一条记录的原始

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,foo的集合,*(很多)
  • foo2,foo的实例,0..1(零或一)

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无法处理这种情况?

0 个答案:

没有答案