与E.F.码首先一到零或一的关系,当列不是主键 [英] One-to-Zero-or-One relationship with E.F. Code First when column is not primary key
问题描述
我开发一个实体框架6.1.3代码优先库,C#和.NET Framework 4.5.1。
I'm developing an Entity Framework 6.1.3 Code First library, C# and .NET Framework 4.5.1.
我有一到一个问题-Zero-或一的关系(或者是另一种关系)。
I have a problem with a One-to-Zero-or-One relationship (or maybe is another kind of relationship).
我有两个表,代码
和 HelperCodes
,代码可以有零个或一个助手代码。这是SQL脚本创建这两个表和它们之间的关系:
I have two tables, Codes
and HelperCodes
, a code could have zero or one helper code. This is the sql script to create these two tables and their relationships:
CREATE TABLE [dbo].[Code]
(
[Id] NVARCHAR(20) NOT NULL,
[Level] TINYINT NOT NULL,
[CommissioningFlag] TINYINT NOT NULL,
[SentToRanger] BIT NOT NULL DEFAULT 0,
[LastChange] NVARCHAR(50) NOT NULL,
[UserName] NVARCHAR(50) NOT NULL,
[Source] NVARCHAR(50) NOT NULL,
[Reason] NVARCHAR(200) NULL,
[HelperCodeId] NVARCHAR(20) NULL,
CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED
(
[Id] ASC
),
CONSTRAINT [FK_Code_LevelConfiguration]
FOREIGN KEY ([Level])
REFERENCES [dbo].[LevelConfiguration] ([Level]),
CONSTRAINT [FK_Code_HelperCode]
FOREIGN KEY ([HelperCodeId])
REFERENCES [dbo].[HelperCode] ([HelperCodeId])
)
CREATE TABLE [dbo].[HelperCode]
(
[HelperCodeId] NVARCHAR(20) NOT NULL,
[Level] TINYINT NOT NULL,
[CommissioningFlag] TINYINT NOT NULL,
[LastChange] NVARCHAR(50) NOT NULL,
CONSTRAINT [PK_HelperCode] PRIMARY KEY CLUSTERED
(
[Id] ASC
),
CONSTRAINT [FK_HelperCode_LevelConfiguration]
FOREIGN KEY ([Level])
REFERENCES [dbo].[LevelConfiguration] ([Level])
)
不过, ,当我尝试做相同的实体框架不这样做。我的问题是规范和HelperCodes foreing键
But, when I try to do the same with Entity Framework it doesn't do the same. My problem is in Codes and HelperCodes foreing key.
这是我的实体框架代码优先代码:
This is my Entity Framework Code First code:
public class Code
{
public string Id { get; set; }
public byte Level { get; set; }
// omitted for brevity
public string HelperCodeId { get; set; }
public virtual HelperCode HelperCode { get; set; }
}
class CodeConfiguration : EntityTypeConfiguration<Code>
{
public CodeConfiguration()
{
HasKey(c => c.Id);
Property(c => c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Property(c => c.Id)
.HasMaxLength(20);
// omitted for brevity
Property(c => c.HelperCodeId)
.HasMaxLength(20)
.IsOptional();
HasOptional(c => c.HelperCode)
.WithRequired(hc => hc.Code);
}
}
public class HelperCode
{
public string HelperCodeId { get; set; }
public byte Level { get; set; }
public byte CommissioningFlag { get; set; }
public string LastChange { get; set; }
public virtual Code Code { get; set; }
}
class HelperCodeConfiguration : EntityTypeConfiguration<HelperCode>
{
public HelperCodeConfiguration()
{
HasKey(h => h.HelperCodeId);
Property(h => h.HelperCodeId)
.HasMaxLength(20);
Property(h => h.Level)
.IsRequired();
Property(h => h.CommissioningFlag)
.IsRequired();
Property(h => h.LastChange)
.IsOptional()
.HasMaxLength(50);
}
}
本实体的Code First的代码生成外键 HelperCodes
使用表 HelperCodes.HelperCodeId
引用 Codes.Id
。
This Entity Code First code generates a foreign key in HelperCodes
table using HelperCodes.HelperCodeId
referencing Codes.Id
.
实体框架只允许这种关系如果两个表具有相同的主键。
Entity Framework only allows this kind of relationship if both tables have the same primary key.
有关如何任何想法?解决这个EF错误
Any idea about how to resolve this E.F. bug?
推荐答案
第一:删除 HelperCodeId
从在代码
类:
public class Code
{
public string Id { get; set; }
public byte Level { get; set; }
// omitted for brevity
public virtual HelperCode HelperCode { get; set; }
}
在代码
配置:
.HasOptional(i => i.HelperCode)
.WithRequired(i => i.Code);
生成迁移:
Generated migration:
CreateTable(
"dbo.Codes",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Level = c.Byte(nullable: false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.HelperCodes",
c => new
{
HelperCodeId = c.String(nullable: false, maxLength: 128),
Level = c.Byte(nullable: false),
CommissioningFlag = c.Byte(nullable: false),
LastChange = c.String(),
})
.PrimaryKey(t => t.HelperCodeId)
.ForeignKey("dbo.Codes", t => t.HelperCodeId)
.Index(t => t.HelperCodeId);
只有 HelperCodes
表应具有国外。关键语句
Only the HelperCodes
table should have the foreign key statement.
HelperCodeId
是主键,也是一个外键,所以它保证了0:1的关系。
HelperCodeId
is a primary key and also a foreign key, so it ensures the 0:1 relationship.
这篇关于与E.F.码首先一到零或一的关系,当列不是主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!