2017-09-26 88 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而不是更新。