使用复合键播种时EF代码首次出错

时间:2014-05-27 09:28:15

标签: entity-framework ef-code-first ef-migrations composite-key composite-primary-key

我有一个具有复合主键(Id和TreeVersion)的实体。我有另一个实体,其值包含引用此键。

第一个实体:

class ClassificationType
{
  [Key]
  [Column(Order = 1)
  public int Id {get;set;}

  [Key]
  [Column(Order = 2, Type="varchar")]
  [StringLength("100")]
  public string TreeVersion {get;set}
}

第二实体:

class ClassConfig
{
  public int Id {get;set;}
  public string Name {get;set;}
  public int? ClassificationTypeId { get; set; }
  [Column(TypeName = "varchar")]
  [StringLength(10)]
  public string TreeVersion { get; set; }
}

有了这个,一切正常 - 我可以用数据播种我的表,一切都很好。

但是,当我尝试添加导航属性(从而将第二个实体的外键添加到第一个实体)时,播种失败。

我将此行添加到第二个实体:

public virtual ClassificationType ClassificationType {get;set;}

这会导致此迁移步骤:

public override void Up()
{
    DropPrimaryKey("dbo.ClassConfig");
    AlterColumn("dbo.ClassConfig", "Id", c => c.Int(nullable: false));
    AddPrimaryKey("dbo.ClassConfig", "Id");
    CreateIndex("dbo.ClassConfig", new[] { "Id", "TreeVersion" });
    AddForeignKey("dbo.ClassConfig", new[] { "Id", "TreeVersion" }, "dbo.ClassificationTypes", new[] { "Id", "TreeVersion" });
}

注意在扣除外键列时它实际上是如何失败的,所以我手动将其更改为

public override void Up()
{
    DropPrimaryKey("dbo.ClassConfig");
    AlterColumn("dbo.ClassConfig", "Id", c => c.Int(nullable: false));
    AddPrimaryKey("dbo.ClassConfig", "Id");
    CreateIndex("dbo.ClassConfig", new[] { "ClassificationTypeId", "TreeVersion" });
    AddForeignKey("dbo.ClassConfig", new[] { "ClassificationTypeId", "TreeVersion" }, "dbo.ClassificationTypes", new[] { "Id", "TreeVersion" });
}

这将创建以下SQL语句:

ALTER TABLE [dbo].[ClassConfig] DROP CONSTRAINT [PK_dbo.ClassConfig]
ALTER TABLE [dbo].[ClassConfig] ALTER COLUMN [Id] [int] NOT NULL
ALTER TABLE [dbo].[ClassConfig] ADD CONSTRAINT [PK_dbo.ClassConfig] PRIMARY KEY ([Id])
CREATE INDEX [IX_ClassificationTypeId_TreeVersion] ON [dbo].[ClassConfig]([ClassificationTypeId], [TreeVersion])
ALTER TABLE [dbo].[ClassConfigEntries] ADD CONSTRAINT [FK_dbo.ClassConfig_dbo.ClassificationTypes_ClassificationTypeId_TreeVersion] FOREIGN KEY ([ClassificationTypeId], [TreeVersion]) REFERENCES [dbo].[ClassificationTypes] ([Id], [TreeVersion])

现在,当我播种表时,脚本失败了。消息是这样的:

  

无法在表中插入identity列的显式值   当IDENTITY_INSERT设置为OFF时,“ClassConfigEntries”。

谁能告诉我为什么会这样?我尝试插入ClassConfig表的值在插入点的ClassificationType表中出现。

我在模型中有大约30个现有表,其中一些表具有指定的标识,并且当从数据库获取值时播种和导航属性可用时,所有这些表都可以正常工作。只是我模特的这个角落,让我感到头疼。

0 个答案:

没有答案