使用相同的密钥配置相关实体​​

时间:2019-07-18 08:39:22

标签: entity-framework entity-framework-6

我有一个实体类型MyEntity,该实体类型具有一个主键string MyEntityCode

我想创建第二个实体MyEntityInfo,它们是某些MyEntity的逻辑关联的扩展属性。

这使这些实体之间的关系一对一,并且一端是可选的-MyEntity在逻辑上可选具有MyEntityInfo,没有导航属性,并且需要MyEntityInfo拥有一个MyEntity(具有导航属性)。

我想在SQL中将其编码为MyEntityInfo,其主键为BaseEntityCode,而主键也是MyEntity的{​​{1}}的外键。

如何在EF6流畅配置API中配置此编码。

示例代码

MyEntityCode

我以为我可以将public class MyEntity { public string MyEntityCode {get; set;} public int SomeProperty {get; set;} } public class MyEntityInfo { public MyEntity BaseEntity {get; set;} public string BaseEntityCode {get; set;} public int OtherInfo {get; set;} } public MyEntityConfiguration : EntityConfiguration<MyEntity> { public MyEntityConfiguration(){ HasKey(e => e.MyEntityCode); } } 配置为

MyEntityInfo

但是public MyEntityInfoConfiguration : EntityConfiguration<MyEntityInfo> { public MyEntityInfoConfiguration(){ HasKey(e => e.BaseEntityCode); HasRequired(e => e.BaseEntity).WithOptional().WithForeignKey(e => BaseEntityCode); } } 不允许链接到WithOptional()

使用WithForeignKey进行同样的操作,以便可以使用外键,这违反了一个的多重性约束:

  

由于从属角色是指关键属性,因此从属角色的多重性的上限必须为'1'。

1 个答案:

答案 0 :(得分:1)

  

我认为我可以将MyEntityInfo配置为

   public class MyEntityInfoConfiguration : EntityTypeConfiguration<MyEntityInfo>
   {
      public MyEntityInfoConfiguration(){
        HasKey(e => e.BaseEntityCode);
        HasRequired(e => e.BaseEntity).WithOptional().WithForeignKey(e => BaseEntityCode);
      }
    }

好吧,几乎要删除WithForeignKey通话!

public class MyEntityInfoConfiguration : EntityTypeConfiguration<MyEntityInfo>
{
    public MyEntityInfoConfiguration()
    {
        HasKey(e => e.BaseEntityCode);
        HasRequired(e => e.BaseEntity).WithOptional();
    }
}

实体框架6只有一种实现1:1关联的方法:从属实体的主键(在此:MyEntityInfo)是主体实体的外键(在此:MyEntity)。

没有WithForeignKey方法,因为有了您建议的映射(没有WithForeignKey),EF就知道了它所存储的唯一1:1实现现在需要知道的所有信息。

产生的数据库模型显示了BaseEntityCode的主键/外键双重作用:

CREATE TABLE [dbo].[MyEntities] (
    [MyEntityCode] [nvarchar](128) NOT NULL,
    [SomeProperty] [int] NOT NULL,
    CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY ([MyEntityCode])
)

CREATE TABLE [dbo].[MyEntityInfoes] (
    [BaseEntityCode] [nvarchar](128) NOT NULL,
    [OtherInfo] [int] NOT NULL,
    CONSTRAINT [PK_dbo.MyEntityInfoes] PRIMARY KEY ([BaseEntityCode])
)
...
ALTER TABLE [dbo].[MyEntityInfoes] 
    ADD CONSTRAINT [FK_dbo.MyEntityInfoes_dbo.MyEntities_BaseEntityCode]
    FOREIGN KEY ([BaseEntityCode]) REFERENCES [dbo].[MyEntities] ([MyEntityCode])