2013-04-18 42 views
0

一对一的关系,我有三个实体:一到零或EF5流利的映射

public class MainEntity() 
{ 
    public long Id { get; set; } 

    public long EntityAId { get; set; } 
    public EntityA OptionalEntityA { get; set; } 

    public long EntityBId { get; set; } 
    public EntityB OptionalEntityB { get; set; } 

    public string SProp { get; set; } 
} 

public class EntityA() 
{ 
    public long Id { get; set; } 

    public long MainEntityId { get; set; } 
    public MainEntity RequiredEntity { get; set; } 
} 

public class EntityB() 
{ 
    public long Id { get; set; } 

    public long MainEntityId { get; set; } 
    public MainEntity RequiredEntity { get; set; } 
} 

所有三个实体必须通过数据库生成有自己的ID:

Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

我如何定义的关系MainEntity和EntityA和EntityB以便具有:

  • MainEntity可能有零个或一个EntityA
  • MainEntity可以有零或一个EntityB
  • EntityA必须有一个MainEntity
  • EntityB必须有一个MainEntity

在我MainEntityConfigurationMap我有这样定义关系:

HasOptional(m => m.OptionalEntityA).WithRequired(ea => ea.RequiredEntity); 
HasOptional(m => m.OptionalEntityB).WithRequired(eb => eb.RequiredEntity); 

展望在生成的迁移我有这EntityA:

 CreateTable(
      "dbo.EntityA", 
      c => new 
       { 
        Id = c.Long(nullable: false, identity: true), 
        MainEntityId = c.Long(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.MainEntity", t => t.Id) 
      .Index(t => t.Id); 

实体框架在这里定义了一个共享主键,有没有一种方法可以避免这种情况,并使MainEntityId向MainEntity.Id移动?

回答

2

实体框架仅支持共享主键之上的一对一关系(从属表中的PK也是FK到主体表)。原因在于依赖表中的FK必须是唯一的以强制执行一对一关系,但EF目前不支持唯一约束(PK除外)。

+0

感谢拉迪斯拉夫,这是适用于整个EF还是只是代码第一? – Swell

+1

这适用于整个EF。 –

1

而且对什么@Ladislav Mrmka该增加...

这里是关于各种一到一个模式进行全面研究 - 特别是如何使其使用FK-s,而不是占用了PK-S (但不要把你的希望提高得太高)。

Create a Unique Constraint To Enforce the Relationship as a One to One

它归结为(种子ING或类似DB初始化过程中)手动执行SQL - 增加了一个UNIQUE CONSTRAINT ...

然而,即使在这种情况下,它不会工作对你来说 - 或者没有改变。

如果我没有错 - 你必须放弃一个导航属性 - 最有可能的是OptionEntityA/B - 因为唯一列不能支持NULL。