每个表只允许一个标识列

时间:2015-02-14 10:39:02

标签: c# ef-code-first code-first fluent

我有这堂课:

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);

当我想运行该项目时,我收到此错误:

  

为表格&#39;评论&#39;指定了多个标识列。只有一个   允许每个表的标识列。 Visual Studio 2013

我在这个课程中只有一个主键,第一行是Id

任何?我需要帮助

2 个答案:

答案 0 :(得分:7)

有时EF无法正确排序DbMigration类中的方法。当您重命名某些实体的PK然后添加迁移并尝试更新数据库时,可能会发生这种情况。为了使其工作,请转到您的迁移类(继承自DbMigration并在添加新迁移时自动生成的类),并在Up()方法中使所有drop语句位于所有其他语句之前。

    public override void Up()
    {
        DropForeignKey();
        DropForeignKey();
        DropIndex();
        DropPrimaryKey();
        RenameColumn();
        RenameColumn();
        RenameIndex();
        RenameIndex();
        AddForeignKey();
        AddForeignKey();
        AddPrimaryKey();
    }

如果表的AddPrimaryKey()语句在DropPrimaryKey()语句之前,您将在删除另一个主键之前添加主键,因此您将临时拥有该表的两个主键,并且主键是标识列。因此,您将获得“为表指定的多个标识列”异常。

答案 1 :(得分:1)

问题是您最有可能定义了多个键。模型中定义的那个是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();