2017-09-26 305 views
1

我剛剛升級到實體框架核心2,現在我得到一個額外的列存在問題,並擁有一個唯一的鍵,即使它不在我的模型,它是沒有在其他地方定義。實體框架核心 - 外鍵1(額外的外鍵列)

指數:

migrationBuilder.CreateTable(
    name: "Vouchers", 
    columns: table => new 
    { 
     Id = table.Column<int>(nullable: false) 
      .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), 
     Code = table.Column<Guid>(nullable: false), 
     IsClaimed = table.Column<bool>(nullable: false), 
     LastModified = table.Column<DateTime>(nullable: false), 
     NumberOfUnits = table.Column<int>(nullable: false), 
     TransactionId = table.Column<int>(nullable: false), 
     TransactionId1 = table.Column<int>(nullable: true) // why is this here? 
    }, 
    constraints: table => 
    { 
     table.PrimaryKey("PK_Vouchers", x => x.Id); 
     table.ForeignKey(
      name: "FK_Vouchers_Transactions_TransactionId1", 
      column: x => x.TransactionId1, 
      principalTable: "Transactions", 
      principalColumn: "Id", 
      onDelete: ReferentialAction.Restrict); 
    }); 

TransactionId1不在模型:

public class Voucher : IAutoLastModified 
{ 
    public int Id { get; set; } 
    public DateTime LastModified { get; set; } 

    public int TransactionId { get; set; } 
    public Transaction Transaction { get; set; } 

    public int NumberOfUnits { get; set; } 
    public Guid Code { get; set; } 
    public bool IsClaimed { get; set; } 
} 

我是否定義了外鍵錯誤?

modelBuilder.Entity<Voucher>().HasOne(x => x.Transaction).WithOne(x => x.Voucher).IsRequired(false); 

我的應用程序失敗,因爲TransactionId1總是會爲空,並且具有我無法刪除的唯一約束。

爲什麼EF爲此表創建一個額外的列?

回答

0

您需要告訴模型構建器您要用作外鍵列的voucher表中的哪一列。否則實體框架將爲您創建一個。

要做到這一點,添加HasForeignKey方法流暢設置:設置在一比一的關係

modelBuilder.Entity<Voucher>().HasOne(x => x.Transaction).WithOne(x => x.Voucher).HasForeignKey<Voucher>(x => x.TransactionId).IsRequired(false); 

注意,你需要將其定義爲一個通用的外鍵存在於實體約束。

0

好吧,我找出了問題所在(將問題保留在任何犯同樣錯誤的人身上)。

我將關係標記爲可選項,但該列是int而不是int?,因此EF決定在幕後添加它自己的列。

解決此問題後,我不得不重新創建數據庫 - 由於現有數據,遷移未成功完成。

0

我以前在使用數據優先方法時遇到過這個問題。我不得不刪除一個現有的列,但每次更新後,該列出現在edmx模式結構中,我必須手動刪除才能使其工作。你可以重新創建edmx而不是更新。