C# 当列不是主键时,先与E.F.代码建立一对零或一关系
我正在开发实体框架6.1.3代码优先库、C#和.NET框架4.5.1 我对一对零或一关系(或者可能是另一种关系)有问题 我有两个表,C# 当列不是主键时,先与E.F.代码建立一对零或一关系,c#,entity-framework,code-first,C#,Entity Framework,Code First,我正在开发实体框架6.1.3代码优先库、C#和.NET框架4.5.1 我对一对零或一关系(或者可能是另一种关系)有问题 我有两个表,code和helpercode,一个代码可以有零个或一个helper代码。这是用于创建这两个表及其关系的sql脚本: CREATE TABLE [dbo].[Code] ( [Id] NVARCHAR(20) NOT NULL, [Level] TINYINT NOT NULL, [CommissioningFlag] TINYINT N
code
和helpercode
,一个代码可以有零个或一个helper代码。这是用于创建这两个表及其关系的sql脚本:
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])
)
但是,当我试图用实体框架做同样的事情时,它却没有做同样的事情。我的问题是在代码和帮助代码的关键
这是我的实体框架代码第一个代码:
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);
}
}
公共类代码
{
公共字符串Id{get;set;}
公共字节级别{get;set;}
//为简洁起见省略
公共字符串HelperCodeId{get;set;}
公共虚拟帮助代码帮助代码{get;set;}
}
class CodeConfiguration:EntityTypeConfiguration
{
公共编码配置()
{
HasKey(c=>c.Id);
属性(c=>c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
属性(c=>c.Id)
.HasMaxLength(20);
//为简洁起见省略
属性(c=>c.HelperCodeId)
.HasMaxLength(20)
.等民族();
has可选(c=>c.HelperCode)
.WithRequired(hc=>hc.Code);
}
}
公共类帮助代码
{
公共字符串HelperCodeId{get;set;}
公共字节级别{get;set;}
公共字节委托GFLAG{get;set;}
公共字符串LastChange{get;set;}
公共虚拟代码{get;set;}
}
类HelperCodeConfiguration:EntityTypeConfiguration
{
公共帮助代码配置()
{
HasKey(h=>h.HelperCodeId);
属性(h=>h.HelperCodeId)
.HasMaxLength(20);
属性(h=>h.Level)
.IsRequired();
属性(h=>h.CommissioningFlag)
.IsRequired();
属性(h=>h.LastChange)
.等民族
.HasMaxLength(50);
}
}
此实体代码第一个代码使用HelperCodes.HelperCodeId
引用Code.Id
在HelperCodes
表中生成外键
只有当两个表具有相同的主键时,实体框架才允许这种关系
知道如何解决这个E.F.错误吗?关系是错误的;把你的代码改成吹代码
public class HelperCode
{
public byte Level { get; set; }
public byte CommissioningFlag { get; set; }
public string LastChange { get; set; }
public string CodeId { get; set; }
public virtual Code Code { get; set; }
}
public class Code
{
public string Id { get; set; }
public byte Level { get; set; }
public virtual HelperCode HelperCode { get; set; }
}
我还从另一端配置关系
public class CodeConfiguration : EntityTypeConfiguration<Code>
{
public CodeConfiguration()
{
HasKey(h => h.Id);
HasOptional(x => x.HelperCode).WithRequired(x => x.Code);
}
}
首先:从
code
类中删除HelperCodeId
:
public class Code
{
public string Id { get; set; }
public byte Level { get; set; }
// omitted for brevity
public virtual HelperCode HelperCode { get; set; }
}
在code
配置中:
.HasOptional(i => i.HelperCode)
.WithRequired(i => i.Code);
生成的迁移:
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
表应该有外键语句
HelperCodeId
是主键,也是外键,因此它确保了0:1关系 什么是“生成的迁移”?我尝试了您的解决方案,但它没有创建列code.HelperCodeId
。我没有尝试生成的迁移
部分。您必须在控制台中运行命令运行迁移Somename
。WithRequired()
没有。HasForeignKey()
。