将记录保存到数据库时出错.使用实体框架.无法为标识列插入显式值



我收到一个错误,但不知道为什么它试图将任何内容保存到"优先级"表中。从数据库中,优先级表的主键为Id。请求表上的ForeignKey为PriorityId。

以下是我收到的错误:"更新条目时出错。有关详细信息,请参阅内部异常。当identity_insert设置为OFF时,无法为表'Priority'中的标识列插入显式值。">

这就像是打电话给数据库。SaveChangesAync();,它试图将某些内容保存到优先级表中,但不应该。优先级表中有项目,所以这也不是问题所在。从控制器返回的模型具有完成输入所需的一切。

这是请求扩展

public static async Task AddRequest(this AppDbContext db, Request request)
{
if (await request.Validate(db))
{
request.DateSubmitted = DateTime.Now;
request.LastModified = DateTime.Now;
request.PriorityId = request.Priority.Id;
request.SiteId = request.Site.Id;
await db.Requests.AddAsync(request);
await db.SaveChangesAsync();
foreach (var item in request.RequestItems)
{
await db.AddItems(item, request.Id);
}
}
}
private static async Task<bool> Validate(this Request model, AppDbContext db)
{
if (string.IsNullOrEmpty(model.Subject))
{
throw new Exception("Subject must be filled in");
}
var check = model.Id > 0 ?
await db.Requests.FirstOrDefaultAsync(x => x.Subject.ToLower() == model.Subject.ToLower() && x.Id == model.Id) :
await db.Requests.FirstOrDefaultAsync(x => x.Subject.ToLower() == model.Subject.ToLower() && x.UserId == model.UserId);
if (check != null)
{
throw new Exception("The provided Request already exists");
}
return true;
}

请求模型

public class Request
{
public int Id { get; set; }
public int PriorityId { get; set; }
public int SiteId { get; set; }
public int UserId { get; set; }
public string Justifications { get; set; }
public Guid Guid { get; set; }
public string Subject { get; set; }
public string Requirement { get; set; } 
public string Mission { get; set; }
public DateTime DateSubmitted { get; set; }
public DateTime LastModified { get; set; }
public bool IsRecurring { get; set; }
public DateTime? RenewalDate { get; set; }
public bool IsApproved { get; set; }
public bool IsComplete { get; set; }
public Priority Priority { get; set; }
public Site Site { get; set; }
public User User { get; set; }

public List<ItemGroup> ItemGroups { get; set; }
public List<RequestAttachment> RequestAttachments { get; set; }
public List<RequestItem> RequestItems { get; set; }
}

}

然后是优先级模型

public class Priority
{
public int Id { get; set; }
public string Label { get; set; }
public bool IsDeleted { get; set; }
public List<Request> Requests { get; set; }
}

以下是我的AddRequest任务的更新和操作版本:感谢@Imantas

public static async Task AddRequest(this AppDbContext db, Request request)
{
if (await request.Validate(db))
{
request.DateSubmitted = DateTime.Now;
request.LastModified = DateTime.Now;
request.PriorityId = request.Priority.Id;
request.SiteId = request.Site.Id;
db.Priorities.Attach(request.Priority);
db.Sites.Attach(request.Site);
await db.Requests.AddAsync(request);
await db.SaveChangesAsync();
foreach (var item in request.RequestItems)
{
await db.AddItems(item, request.Id);
}
}
}

您的request.Priority实体要么与DbContext分离,要么从未附加。您也可能从DbContext的另一个实例中检索到它。您没有为该方法提供其来源的上下文,因此很难判断确切的原因是什么。通过这种方式,变更跟踪器将其标识为一个新实体并尝试插入它。由于它已经设置了Id,所以数据库拒绝此插入。

这里有多种选择。其中之一是手动将request.Priority附加到具有Unchanged状态的当前DbContext。另一个更简单。只需在设置request.PriorityId = request.Priority.Id之后立即显式设置request.Priority = null;。这样,更改跟踪器就不会看到您不想插入的实体,也不会尝试将其插入数据库。关系(外键)仍然会被正确设置,所以不用担心。

但是,如果在保存后需要使用request.Priority关系,则需要从数据库中重新加载实体或将其重新设置。在这种情况下,第一种选择可能会更好。

最新更新