我有这样的代码:
foreach (ContactImportRequest row in toImport)
{
Contact contact = _mapper.Map<Contact>(row);
// if first or last names are null, we fill them with anything because are required fields
if (contact.FirstName == null || contact.FirstName.Equals("") || contact.FirstName == String.Empty)
contact.FirstName = "FirstName";
if (contact.LastName == null || contact.LastName.Equals("") || contact.LastName == String.Empty)
contact.LastName = "LastName";
contacts.Add(contact);
}
await _context.Contacts.AddRangeAsync(contacts);
await _context.SaveChangesAsync();
字符串SaveChangesAsync
调用中断,并出现以下错误:
Microsoft. MicrosoftFrameworkCore.DbUpdateException:保存实体更改时出错。有关详细信息,请参阅内部异常。
Npgsql.PostgresException(0x 80004005):23502:关系“Users”的“FirstName”列中的空值违反了not-null约束
我已经调试过了,FirstName
没有空值,为了以防万一,我添加了这两个“if”,检查名字或姓氏是否为空,在这些情况下设置一个固定值。
此外,在调试时,FirstName
为null时,contacts
列表中没有联系人。
更新:
联系人表与用户表无关。它们是两个独立的实体,具有不同的属性。
下面是Contact类:
public class Contact
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string? MainPhone { get; set; }
public string? CellPhone { get; set; }
public string? MainEmail { get; set; }
[ForeignKey("LinkedUser")]
public string? LinkedUserId { get; set; }
public virtual User? LinkedUser { get; set; }
}
型
更新#2:
下面是前面的代码行和完整的foreach
代码:
List<User> users = await _context.Users.AsNoTracking().ToListAsync();
foreach (ContactImportRequest row in toImport)
{
Contact contact = _mapper.Map<Contact>(row);
contact.LinkedUserId = users.FirstOrDefault(x => x.LastName == row.LinkedUserLastName)?.Id;
//if first or last names are null, we fill them with anything because are required fields
if (contact.FirstName == null || contact.FirstName.Equals("") || contact.FirstName == String.Empty)
contact.FirstName = "FirstName";
if (contact.LastName == null || contact.LastName.Equals("") || contact.LastName == String.Empty)
contact.LastName = "LastName";
contacts.Add(contact);
}
await _context.Contacts.AddRangeAsync(contacts);
await _context.SaveChangesAsync();
型
我处理用户的唯一地方是获得他们的列表,我是以NoTracking的身份来做的。
2条答案
按热度按时间u4vypkhs1#
自动回答我的问题与解决方案。
问题是Entity Framework将
LinkedUser
值视为在上下文中保存更改时创建的新User。这是最后的代码块工作:
字符串
感谢一些用户对原始问题的评论,并引导我找到解决方案。
3hvapo4f2#
首先,您可以将大量检查替换为:
字符串
其次,错误似乎与
Users
关系有关,而不是Contacts
表。我假设您的Contacts
表在数据库中不称为Users
,但您可能希望检查关系而不是此特定函数。