Entity Framework 6 多对多想要插入重复行

2024-05-21

不应该这么难!我准备放弃EF了...

我的模型有周刊版本。每个版本可以有许多分类广告。每个分类可以出现在一个或多个版本中。我的模型:

public class Classifieds
{ 
  [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int ClassifiedId { get; set; }
  ...
  public virtual ICollection<EditionModel> Editions { get; set; }
}

public class EditionModel
{
  [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
  public int EditionId { get; set; } // This is YYYYWW, WW = week number
  public Date PublicationDate { get; set; }
  public virtual ICollection<Classifieds> Classifieds { get; set; }
}

OnModelCreating 重写:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<EditionModel>()
     .Property(z => z.EditionId)
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

   modelBuilder.Entity<EditionModel>()
     .HasMany(c => c.Classifieds)
     .WithMany(d => d.Editions)
     .Map(x =>
     {
       x.MapLeftKey("EditionId");
       x.MapRightKey("ClassifiedId");
       x.ToTable("EditionModelClassifieds");
     });
   base.OnModelCreating(modelBuilder);
}

创建分类操作代码(HTTP put):

public async Task<ActionResult> Create(Classifieds classifieds, int[] EditionList)
{
  var allPubs = PopulateEditionList(); // Current and next 12 editions
  db.Set<Classifieds>().Attach(classifieds);
  db.Entry(classifieds).Collection(x => x.Editions).Load();
  foreach (var p in EditionList)
  {
      var anEd = (from x in allPubs where x.EditionId == p select x).Single();
      classifieds.Editions.Add(anEd);
  }
  ...
  if (ModelState.IsValid)
  {
     var ads = db.Classifieds.Add(classifieds);
     await db.SaveChangesAsync().ConfigureAwait(false);
     return View("Receipt", classifieds);
  }
  ...
}

提交新的分类广告后,我得到

Violation of PRIMARY KEY constraint 'PK_dbo.EditionModels'.  
Cannot insert duplicate key in object 'dbo.EditionModels'.

为什么 EF 坚持要在 EditionModels 中插入重复行,而不是仅仅将联结表行链接到其中的现有行?我该如何解决这个问题?


显然PopulateEditionList()不将版本附加到上下文。添加这一行在foreach loop:

db.Set<EditionModel>().Attach(anEd);

也许您可以简化整个过程。我不确定你为什么将版本加载到内存中。您可以根据足以创建关系的密钥创建一个“存根实体”。还附上classifieds在上下文中似乎是多余的,因为您想将其作为新实体添加到数据库中。尝试从数据库加载数据库中尚不存在的父实体的相关版本似乎也是多余的。结果只能是一个空集合。

因此,以下更简单的版本也可能有效:

public async Task<ActionResult> Create(Classifieds classifieds, int[] EditionList)
{
    classifieds.Editions = new List<EditionModel>();
    foreach (var p in EditionList)
    {
        var anEd = new EditionModel { EditionId = p };
        db.Set<EditionModel>().Attach(anEd);
        classifieds.Editions.Add(anEd);
    }
    //...
    if (ModelState.IsValid)
    {
        var ads = db.Classifieds.Add(classifieds);
        await db.SaveChangesAsync().ConfigureAwait(false);
        return View("Receipt", classifieds);
    }
    //...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework 6 多对多想要插入重复行 的相关文章

随机推荐

  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • 有没有非常轻的灯箱? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 尝试将 Firebase 版本回滚到 2.X

    我最近更新到了新的 Firebase 3 但不幸的是 据我所知 它目前不支持 Geofire 查询 这对我的应用程序很重要 我已经将应用程序中的其他所有内容都转为使用 Firebase 2 但是当我尝试时要将我的应用程序部署到 fireba
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 如何对单个 TypoSript 对象生成进行基准测试?

    我想对单个 TypoScript 对象生成进行基准测试以控制性能 是否可以使用某些 stdWrap 方法 我想要对其进行基准测试的 TS 对象示例 Test 1 page 10 RECORDS page 10 tables pages so
  • 在 Visual Studio 2013 中使用 v60 平台工具集时,调试信息不​​匹配

    我正在使用 Visual Studio 2013 但我需要使用 Visual C 6 0 编译器开发一个旧项目 为此 我一直在使用Daffodil https daffodil codeplex com 在 Windows 8 1 上暂时没
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • 是否可以使用 MS Visual Studio 作为 LaTeX 用户的 IDE?

    我是 Microsoft Visual Studio 的忠实粉丝 我喜欢代码折叠 自动完成 自动格式化等等 我想如果我能将 MS Visual Studio 用作 LaTeX 用户的 IDE 就好了 简而言之 可能吗 对于第一步 我认为让我
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • FormsAuthentication:安全吗?

    Using 表单验证构建成asp net创建一个为经过身份验证的用户创建 cookie 的登录系统非常快速且简单 FormsAuthentication SetAuthCookie uniqueUsername false 与中的一些代码配
  • CSS - 第一个没有特定类别的孩子

    是否可以编写一个 CSS 规则来选择没有特定类的元素的第一个子元素 example div span class common class ignore span span class common class ignore span sp
  • 如何从灰度字节缓冲区图像创建位图?

    我正在尝试使用新的 Android 人脸检测移动视觉 API 来处理帧图像 所以我创建了自定义检测器来获取帧并尝试调用 getBitmap 方法 但它为空 所以我访问了帧的灰度数据 有没有办法从它或类似的图像持有者类创建位图 public
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12
  • 如何将枚举作为字符串存储到rails中的数据库中

    如何在 ruby 中创建迁移 其中默认值是字符串而不是整数 我想将枚举存储到数据库中 但我不想将其存储为整数 因为这样对于另一个应用程序来说没有意义想要使用同一张桌子 我该怎么做default female 代替default 0 clas
  • Typescript:如何定义生成可调用实例的类

    我目前正在将 JS 类转换为 TypeScript 该类扩展自 NPM 模块节点可调用实例 https www npmjs com package callable instance 这使得它在内部成为 Function 的子类 类的实例可
  • html,将链接显示为普通文本

    我想知道您是否可以将链接显示为普通文本 a href target self img src width 121 height 20 alt div style font size 12px display block font color
  • 用于标签搜索的数据存储解决方案

    我已经按照预先计算的分数订购了数百万件商品 每个项目都有许多布尔属性 假设总共有大约一万个可能的属性 每个项目有十几个 我希望能够请求实时 几毫秒 给定任意属性组合的前 n 个项目 您会推荐什么解决方案 我正在寻找可扩展性极强的东西 我们目
  • Entity Framework 6 多对多想要插入重复行

    不应该这么难 我准备放弃EF了 我的模型有周刊版本 每个版本可以有许多分类广告 每个分类可以出现在一个或多个版本中 我的模型 public class Classifieds Key DatabaseGenerated DatabaseGe