【问题标题】:configure related entities with the same key用相同的键配置相关实体
【发布时间】:2019-11-27 03:30:27
【问题描述】:

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

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

这使得这些实体之间的关系是一对一的,一端是可选的——MyEntity 逻辑上可选地有一个MyEntityInfo,没有导航属性,而MyEntityInfo 需要有一个@987654329 @(带有导航属性)。

我想在 SQL 中将其编码为 MyEntityInfo,它的主键 BaseEntityCode 也是 MyEntityMyEntityCode 的外键。

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

示例代码

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

做同样的事情,但使用WithMany() 使得外键成为可能,违反了一个的多重性约束:

因为Dependent Role指的是关键属性,所以Dependent Role的重数上限必须为'1'。

【问题讨论】:

  • 为什么不让 MyEntity 作为 MyEntityInfo 的基类?
  • @Neil.Work 我不喜欢使用类继承来编码数据之间的关系。如果这是获得我想要的架构的唯一方法,那么它就是这样,但编码很少比组合替代 IMO 具有优势。
  • @Neil.Work 在这个具体的例子中,改变一个现有的 MyEntity,并添加 MyEntityInfo 似乎很麻烦。您需要一个新实例,因为您需要构造一个新的子类型来替换旧的超类型。

标签: entity-framework entity-framework-6


【解决方案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();
    }
}

Entity Framework 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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2022-01-16
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多