Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;附加类型为X的实体失败,因为另一个相同类型的实体";在多个条目上出错_C#_Entity Framework - Fatal编程技术网

C# &引用;附加类型为X的实体失败,因为另一个相同类型的实体";在多个条目上出错

C# &引用;附加类型为X的实体失败,因为另一个相同类型的实体";在多个条目上出错,c#,entity-framework,C#,Entity Framework,我有以下代码: try { newJob.Company = ((CustomPrincipal)HttpContext.Current.User).MyUser.WorkinCompany; Random rnd = new Random(); newJob.JobId = rnd.Next(1000000, 1

我有以下代码:

               try
                {
                    newJob.Company = ((CustomPrincipal)HttpContext.Current.User).MyUser.WorkinCompany;

                    Random rnd = new Random();
                    newJob.JobId = rnd.Next(1000000, 10000000); 

                    realjob.RelatedJobs.Add(newJob);
                    _db.Entry(realjob).State = EntityState.Modified;
                }
                catch (Exception e)
                {

                }
我得到一个例外:

附加“MySolution.Models.Register.MyUser”类型的实体 失败,因为相同类型的另一个实体已具有相同的 主键值。使用“附加”方法或 将实体的状态设置为“未更改”或“已修改”(如果有) 图中的实体具有冲突的键值。这可能是因为 有些实体是新的,尚未收到数据库生成的密钥 价值观在这种情况下,请使用“添加”方法或“添加”实体状态 跟踪图形,然后将非新实体的状态设置为 “未更改”或“修改”,视情况而定


我怎样才能摆脱这个异常?谢谢。

首先,您的随机函数
rnd。下一步(1000010000000000)
最终将返回数据库中已经存在的int(可能不是前三次使用它,但一定要过一段时间)

因此,难怪总是会出现重复的主键异常

然后,使用随机不是生成新实体的主键的正确方法,请考虑如下选项:

  • 查询表以查找主键的最大值,并将+1添加到表中,如果不存在,则将其放入1

  • 使用数据库集成标识列,只需添加没有主键的实体,主键将自动生成

  • 副本(?):

    代码中的其他[主要]问题与您收到的错误没有直接关系,因为错误明确指出问题出在DegerlemeTakip.Models.Register.MyUser类上

    假设JobID是Job类的主键,将其设置为随机值不是一个好主意。将JobID属性标记为Database generated,让DB担心设置键,并删除将PK设置为随机值的行

    假设:

    public class Job
    {
        [Key]        
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int JobID { get; set;}
    }
    
    将代码更改为:

    try
    {
        newJob.Company = ((CustomPrincipal)HttpContext.Current.User).MyUser.WorkinCompany;
    
        realjob.RelatedJobs.Add(newJob);
        _db.Entry(realjob).State = EntityState.Modified;
    }
    catch (Exception e)
    {
         //Please do something with the exception!
    }
    
    此外,不必将realJob的状态设置为Modified。删除此行,除非您有特定原因:

    _db.Entry(realjob).State = EntityState.Modified;
    
    如果必须随机设置JobID,则在尝试将其附加到数据上下文之前,需要检查以确保随机分配的JobID尚未使用:

        try
    {
        newJob.Company = ((CustomPrincipal)HttpContext.Current.User).MyUser.WorkinCompany;
    
        Random rnd = new Random();
        newJob.JobId = rnd.Next(1000000, 10000000); 
    
        // Keep Trying Random JobIDs until one doesn't already exist in the database
        while(_db.Jobs.Any(j => j.JobID == newJob.JobID))
            newJob.JobId = rnd.Next(1000000, 10000000); 
    
        realjob.RelatedJobs.Add(newJob);
        _db.Entry(realjob).State = EntityState.Modified;
    }
    catch (Exception e)
    {
         //Please do something with the exception!
    }
    

    上面的代码仍然存在一些主要问题,例如,一旦您的表中有9000000个作业,就不会有更多的ID需要分配,您的代码将永远循环,但您可以确定是否必须从代码中随机设置密钥。

    我想您在最初的帖子中漏掉了一个零。随机数生成器从1000000到10000000(一百万到1000万)。顺便说一下,使用guid作为主键