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(可能不是前三次使用它,但一定要过一段时间)
因此,难怪总是会出现重复的主键异常
然后,使用随机不是生成新实体的主键的正确方法,请考虑如下选项:
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作为主键