0

我有三个实体:

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?

4

2 回答 2

2

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

于 2013-04-18T11:02:01.610 回答
1

并补充@Ladislav Mrmka所说的......

这是对各种一对一模式的完整研究——特别是如何使用FK-s而不是捆绑 PK-s(但不要把希望寄得太高)。

创建一个独特的约束来加强一对一的关系

它归结为手动执行 SQL(在播种或类似的 Db 初始化期间) - 它添加了一个UNIQUE CONSTRAINT...

但是,即使在这种情况下,它也对您不起作用 - 或者没有更改。

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

于 2013-04-18T11:23:15.013 回答