当列不是主键时,与EF Code First的一对一或一对一关系

我正在开发一个Entity Framework 6.1.3 Code First库,C#和.NET Framework 4.5.1。

我有一对一或零关系的问题(或者可能是另一种关系)。

我有两个表, CodesHelperCodes ,代码可能有零个或一个帮助程序代码。 这是用于创建这两个表及其关系的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]) ) 

但是,当我尝试对Entity Framework执行相同操作时,它不会这样做。 我的问题在于代码和HelperCodes的关键。

这是我的entity framework代码第一个代码:

 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 { 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 { 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); } } 

此实体代码第一代码使用引用Codes.IdHelperCodes表中生成外键。

如果两个表具有相同的主键,则entity framework仅允许此类关系。

有关如何解决这个EF错误的任何想法?

第一步:从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的关系。

这种关系是错误的;将代码更改为代码

  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 { public CodeConfiguration() { HasKey(h => h.Id); HasOptional(x => x.HelperCode).WithRequired(x => x.Code); } }