【问题标题】:Entity Framework Many To Many allow duplicates实体框架多对多允许重复
【发布时间】:2017-03-13 17:24:34
【问题描述】:

是否可以在多对多关系中插入重复行?这是我的课:

public class EventPaintballBundle
    {
        [Key, Column(Order = 0)]
        public int EventID { get; set; }
        [Key, Column(Order = 1)]
        public int PaintballBundleID { get; set; }

        public virtual Event Event { get; set; }
        public virtual PaintballBundle PaintballBundle { get; set; }

        [Range(1, Int32.MaxValue)]
        public int PersonCount { get; set; }

        [Required]
        public DateTime Data { get; set; }
    }

我想插入这些值的第二行。区别在于日期 DatePersonCount

EventPaintballBundle xx = new EventPaintballBundle() { PaintballBundleID = 1, EventID = 155, Data = DateTime.Now, PersonCount = 5 };
                    dc.EventPaintballBundles.Add(xx);
                    dc.SaveChanges();

我想插入两个键的副本时出错。

{"违反主键约束'PK_dbo.EventPaintballBundles'。 无法在对象“dbo.EventPaintballBundles”中插入重复键。这 重复键值为 (155, 1)。\r\n语句已被 终止。”}

如何解决这个问题?

【问题讨论】:

  • 您能否展示您如何创建一个EventPaintballBundle 对象并将其插入到您的数据库中?
  • 好的,看看我编辑的帖子
  • 但是你不能插入两行相同的EventIDPaintballBundleID,这些是你实体的PK
  • 您不能插入重复的主键,就像人们没有重复的 SSN 一样。不用管它们,sql server 会自动分配这些键。
  • 但是我需要与另一个 DatePersonCount 重复,那我该如何解决呢?

标签: asp.net asp.net-mvc entity-framework many-to-many entity


【解决方案1】:

创建一个不是以下组合的主键:

    public int EventID { get; set; }
    public int PaintballBundleID { get; set; }

新的主节点应该是唯一的,并且与实际存在的任何东西都无关,这个键的存在只是为了让你的模型在数据库中工作。

这是一个典型的错误:认为你的主键应该代表存在的东西......不

我很难学会:即使我认为现有数据的某些组合将永远保持独一无二。我不使用它。我总是根据自己的设计创建主键,不代表任何真实的东西。

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多