【问题标题】:Only one identity column per table is allowed每个表只允许一个标识列
【发布时间】:2015-04-15 09:20:02
【问题描述】:

我有这门课:

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

我使用这样的 fluent 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);

当我想运行项目时,我得到了这个错误:

为表“评论”指定了多个标识列。只有一个 允许每个表的标识列。视觉工作室 2013

我在这个类中只有一个主键,即第一行中的Id

有人吗?我需要帮助

【问题讨论】:

  • 你得到的错误在哪里?
  • @Joker 我在帖子中添加了错误。
  • 你有流畅的API配置吗?
  • @NikolayKostov 我添加了我的烟道 API。请看。

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


【解决方案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();

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2010-09-20
      • 2012-06-02
      • 2012-05-28
      • 2020-03-01
      相关资源
      最近更新 更多