多对多关系更新:无法插入重复键

2024-05-15

首先我还是 EF 代码新手,所以请宽容我。

我有这些实体类:

    public class User
    {
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string EmailAddress { get; set; }
        public string Password { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }
        public virtual ICollection<Task> TaskAssignees { get; set; }

        public User()
        {
           Tasks = new List<Task>();
        }
    }

    public class Task
    {
       public int TaskId { get; set; }
       public string Name { get; set; }
       public virtual User CreateBy { get; set; }
       public int UserId { get; set; }
       public virtual ICollection<User> Assignees { get; set; }

       public Task()
       {
         Assignees = new List<User>();
       }
    }

具有映射配置:

public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        Property(u=>u.UserName)
            .IsRequired()
            .HasMaxLength(30);
        Property(u => u.EmailAddress)
            .IsRequired()
            .HasMaxLength(255);
        Property(u => u.Password)
            .IsRequired()
            .HasMaxLength(255);
    }
}

public class TaskMap : EntityTypeConfiguration<Domain.Entities.Task>
{
    public TaskMap()
    {
        Property(t => t.Name)
           .IsRequired()
           .HasMaxLength(255);
        HasRequired(t => t.CreateBy)
            .WithMany(u => u.Tasks)
            .HasForeignKey(t => t.UserId)
            .WillCascadeOnDelete(false)
            ;
        HasMany(t => t.Assignees)
            .WithMany(u => u.TaskAssignees)
            .Map(a =>
                {
                    a.ToTable("TaskAssignees");
                    a.MapLeftKey("TaskId");
                    a.MapRightKey("UserId");
                })
            ;
    }
}

和一个相当通用的存储库类:

    public class EntityRepository<TEntity> : IEntityRepositoryGetWithCRUD<TEntity> where TEntity : class 
    {
        internal DbContext context;
        internal DbSet<TEntity> dbSet;

        public EntityRepository(DbContext Context)
        {
            this.context = Context;
            this.dbSet = context.Set<TEntity>();
        }

        public virtual IQueryable<TEntity> All
        {
            get { return dbSet; }
        }

        public virtual IQueryable<TEntity> AllIncluding(params System.Linq.Expressions.Expression<Func<TEntity, object>>[] IncludeProperties)
        {
            IQueryable<TEntity> query = dbSet;

            foreach (var includeProperty in IncludeProperties)
            {
                query = query.Include(includeProperty);
            }
            return query;
        }

        public virtual IEnumerable<TEntity> Get(
            Expression<Func<TEntity, bool>> Filter = null,
            Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> OrderBy = null,
            params System.Linq.Expressions.Expression<Func<TEntity, object>>[] IncludeProperties)
        {
            IQueryable<TEntity> query = dbSet;

            if (Filter != null)
            {
                query = query.Where(Filter);
            }

            foreach (var includeProperty in IncludeProperties)
            {
                query = query.Include(includeProperty);
            }

            if (OrderBy != null)
            {
                return OrderBy(query).ToList();
            }
            else
            {
                return query.ToList();
            }
        }

        public virtual TEntity Find(int Id)
        {
            return dbSet.Find(Id);
        }

        public virtual void Insert(TEntity Entity)
        {
            dbSet.Add(Entity);
        }

        public virtual void Update(TEntity Entity)
        {
            dbSet.Add(Entity);
            context.Entry(Entity).State = EntityState.Modified;
        }

        public virtual void Delete(int Id)
        {
            var entity = dbSet.Find(Id);
            dbSet.Remove(entity);
        }

        public virtual void Delete(TEntity Entity)
        {
            if (context.Entry(Entity).State == EntityState.Detached)
            {
                dbSet.Attach(Entity);
            }
            dbSet.Remove(Entity);

        }

        public virtual void Dispose()
        {
            context.Dispose();
        }

        public virtual void Save()
        {
            context.SaveChanges();
        }

    }

通过上面的代码,我可以顺利地将新的任务行插入数据库。 然而,当我尝试用这个简单的代码更新任务时,问题出现了:

 Task task = repository.Find(2);

 if (task != null)
 {
    task.Name = "Test Update";
    repository.Update(task);
    repository.Save();
 }

错误说:

违反主键约束“PK_dbo.TaskAssignees”。不能 在对象“dbo.TaskAssignees”中插入重复的键。声明中有 已被终止。

有人能给我一些启发吗?


我认为你的问题可能在于你如何调用更新。

我不确定,但我认为您的实体已经由上下文管理,因此您不需要添加它以将其置于更新状态。如果您只是删除更新调用并尝试保存,一切都会正常吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多对多关系更新:无法插入重复键 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐