我有一个实体类型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'。
答案 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])