使用相同的密钥配置相关实体
configure related entities with the same key
我有一个实体类型 MyEntity
,它有一个主键 string MyEntityCode
我想创建第二个实体 MyEntityInfo
,它是某些 MyEntity
逻辑关联的扩展属性。
这使得这些实体之间的关系成为一对一的关系,其中一端是可选的——MyEntity
逻辑上可选地具有 MyEntityInfo
,没有导航 属性,并且 MyEntityInfo
需要有一个 MyEntity
(带有导航 属性)。
我想在 SQL 中将其编码为 MyEntityInfo
,它有一个主键 BaseEntityCode
,它也是 MyEntity
的 MyEntityCode
的外键。
如何在 EF6 流畅配置中配置此编码 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()
以便可以使用外键,违反了 one 的多重性约束:
Because the Dependent Role refers to the key properties, the upper bound of the multiplicity of the Dependent Role must be '1'.
I thought I could configure MyEntityInfo as
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
的主要 key/foreign 关键双重角色:
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])
我有一个实体类型 MyEntity
,它有一个主键 string MyEntityCode
我想创建第二个实体 MyEntityInfo
,它是某些 MyEntity
逻辑关联的扩展属性。
这使得这些实体之间的关系成为一对一的关系,其中一端是可选的——MyEntity
逻辑上可选地具有 MyEntityInfo
,没有导航 属性,并且 MyEntityInfo
需要有一个 MyEntity
(带有导航 属性)。
我想在 SQL 中将其编码为 MyEntityInfo
,它有一个主键 BaseEntityCode
,它也是 MyEntity
的 MyEntityCode
的外键。
如何在 EF6 流畅配置中配置此编码 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()
以便可以使用外键,违反了 one 的多重性约束:
Because the Dependent Role refers to the key properties, the upper bound of the multiplicity of the Dependent Role must be '1'.
I thought I could configure MyEntityInfo as
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
的主要 key/foreign 关键双重角色:
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])