2015-09-18 55 views
1

我開發一個實體框架6.1.3代碼優先庫,C#和.NET Framework 4.5.1當列不是主要的。與E.F.碼首先一到零或一的關係鍵

我有一個一到零或一對一的關係問題(或者也許是另一種關係)。

我有兩個表,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]) 
) 

但是,當我嘗試做相同的實體框架不這樣做。我的問題是在密碼和幫助代碼中。

這是我的實體框架代碼優先代碼:

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.HelperCodeId引用Codes.IdHelperCodes表生成的外鍵。

實體框架只允許這種關係如果兩個表具有相同的主鍵。

有關如何解決此E.F.錯誤任何想法?

回答

0

的關係是錯誤的,更改代碼吹代碼

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); 
    } 
} 
+0

'.WithRequired()'沒有'.HasForeignKey()'。 – VansFannel

1

第一:從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的關係。

+0

什麼是「生成的遷移」?我已經嘗試過你的解決方案,但它不創建「Code.HelperCodeId」列。我還沒有嘗試'生成的遷移「部分。 – VansFannel

+0

您必須在控制檯中運行「Run-Migration Somename」命令 –

相關問題