每个 table 只允许一个标识列
Only one identity column per table is allowed
我有这个 class :
public class Comment
{
public virtual int Id { get; set; }
public string Body { get; set; }
public DateTime AddDate { get; set; }
[ForeignKey("PostId")]
public virtual Post Post { get; set; }
public int PostId { get; set; }
public virtual bool IsApproved { get; set; }
public virtual int LikeCount { get; set; }
public int? ParentId { get; set; }
public virtual Comment Parent { get; set; }
public ICollection<Comment> Children { get; set; }
public virtual Member Member { get; set; }
public virtual byte[] RowVersion { get; set; }
}
我使用流利的 API 是这样的:
this.HasRequired(x => x.Post)
.WithMany(x => x.Comments)
.WillCascadeOnDelete();
this.HasOptional(x => x.Parent)
.WithMany(x=>x.Children)
.HasForeignKey(x=>x.ParentId)
.WillCascadeOnDelete(false);
当我想要 运行 项目时,我得到这个错误:
Multiple identity columns specified for table 'Comments'. Only one
identity column per table is allowed. Visual Studio 2013
我在这个 class 中只有一个主键,即第一行中的 Id
。
有人吗?我需要帮助
问题是您很可能定义了多个键。在您的模型中定义的一个是 Id
,另一个在您的流利 API.
中定义
我已尝试重现您的问题并且代码运行良好。
这是我的模型:
public class Comment
{
public virtual int Id { get; set; }
public string Body { get; set; }
public DateTime AddDate { get; set; }
public virtual Post Post { get; set; }
public int PostId { get; set; }
public virtual bool IsApproved { get; set; }
public virtual int LikeCount { get; set; }
public int? ParentId { get; set; }
public virtual Comment Parent { get; set; }
public ICollection<Comment> Children { get; set; }
public virtual Member Member { get; set; }
public virtual byte[] RowVersion { get; set; }
}
public class Post
{
public int Id { get; set; }
}
public class Member
{
public int Id { get; set; }
}
这是我用来检查模型是否正常工作的代码:
var db = new ApplicationDbContext();
db.Comments.Add(new Comment()
{
AddDate = DateTime.Now,
Body = "asd",
IsApproved = true,
LikeCount = 12,
Member = new Member(),
Post = new Post()
});
db.SaveChanges();
有时 EF 无法正确排序 DbMigration class 中的方法。当您重命名某些实体的 PK 然后添加迁移并尝试更新数据库时,可能会发生这种情况。为了使其工作,请转到您的迁移 class(继承自 DbMigration 并在您添加新迁移时自动生成的迁移)并在 Up() 方法中使所有 drop 语句位于所有其他语句之前声明。
public override void Up()
{
DropForeignKey();
DropForeignKey();
DropIndex();
DropPrimaryKey();
RenameColumn();
RenameColumn();
RenameIndex();
RenameIndex();
AddForeignKey();
AddForeignKey();
AddPrimaryKey();
}
如果 table 的 AddPrimaryKey() 语句在 DropPrimaryKey() 语句之前,您将在删除另一个主键之前添加一个主键,因此您将临时有两个主键 table,主键是标识列。因此,您会得到 "Multiple identity columns specified for table" 异常。
我有这个 class :
public class Comment
{
public virtual int Id { get; set; }
public string Body { get; set; }
public DateTime AddDate { get; set; }
[ForeignKey("PostId")]
public virtual Post Post { get; set; }
public int PostId { get; set; }
public virtual bool IsApproved { get; set; }
public virtual int LikeCount { get; set; }
public int? ParentId { get; set; }
public virtual Comment Parent { get; set; }
public ICollection<Comment> Children { get; set; }
public virtual Member Member { get; set; }
public virtual byte[] RowVersion { get; set; }
}
我使用流利的 API 是这样的:
this.HasRequired(x => x.Post)
.WithMany(x => x.Comments)
.WillCascadeOnDelete();
this.HasOptional(x => x.Parent)
.WithMany(x=>x.Children)
.HasForeignKey(x=>x.ParentId)
.WillCascadeOnDelete(false);
当我想要 运行 项目时,我得到这个错误:
Multiple identity columns specified for table 'Comments'. Only one identity column per table is allowed. Visual Studio 2013
我在这个 class 中只有一个主键,即第一行中的 Id
。
有人吗?我需要帮助
问题是您很可能定义了多个键。在您的模型中定义的一个是 Id
,另一个在您的流利 API.
我已尝试重现您的问题并且代码运行良好。
这是我的模型:
public class Comment
{
public virtual int Id { get; set; }
public string Body { get; set; }
public DateTime AddDate { get; set; }
public virtual Post Post { get; set; }
public int PostId { get; set; }
public virtual bool IsApproved { get; set; }
public virtual int LikeCount { get; set; }
public int? ParentId { get; set; }
public virtual Comment Parent { get; set; }
public ICollection<Comment> Children { get; set; }
public virtual Member Member { get; set; }
public virtual byte[] RowVersion { get; set; }
}
public class Post
{
public int Id { get; set; }
}
public class Member
{
public int Id { get; set; }
}
这是我用来检查模型是否正常工作的代码:
var db = new ApplicationDbContext();
db.Comments.Add(new Comment()
{
AddDate = DateTime.Now,
Body = "asd",
IsApproved = true,
LikeCount = 12,
Member = new Member(),
Post = new Post()
});
db.SaveChanges();
有时 EF 无法正确排序 DbMigration class 中的方法。当您重命名某些实体的 PK 然后添加迁移并尝试更新数据库时,可能会发生这种情况。为了使其工作,请转到您的迁移 class(继承自 DbMigration 并在您添加新迁移时自动生成的迁移)并在 Up() 方法中使所有 drop 语句位于所有其他语句之前声明。
public override void Up()
{
DropForeignKey();
DropForeignKey();
DropIndex();
DropPrimaryKey();
RenameColumn();
RenameColumn();
RenameIndex();
RenameIndex();
AddForeignKey();
AddForeignKey();
AddPrimaryKey();
}
如果 table 的 AddPrimaryKey() 语句在 DropPrimaryKey() 语句之前,您将在删除另一个主键之前添加一个主键,因此您将临时有两个主键 table,主键是标识列。因此,您会得到 "Multiple identity columns specified for table" 异常。