我有这堂课:
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
。
任何?我需要帮助
答案 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();