我有一个具有复合主键(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个现有表,其中一些表具有指定的标识,并且当从数据库获取值时播种和导航属性可用时,所有这些表都可以正常工作。只是我模特的这个角落,让我感到头疼。