每个 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" 异常。