提问人:ajzbrun 提问时间:11/7/2023 最后编辑:ajzbrun 更新时间:11/9/2023 访问量:99
关系列中的 Null 值违反了非 null 约束 .net EF
Null value in column of relation violates not-null constraint .net EF
问:
我有这个代码:
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.EntityFrameworkCore.DbUpdateException:保存实体更改时出错。有关详细信息,请参阅内部异常。
Npgsql.PostgresException (0x80004005): 23502:关系“Users”的列“FirstName”中的 null 值违反了非 null 约束
我已经调试过了,并且没有与空值联系,以防万一我添加了这两个“if”,检查名字或姓氏是否为空,在这些情况下设置一个固定值。FirstName
此外,调试时,列表中没有 in null 的联系人。contacts
FirstName
更新:
“联系人”表与“用户”表无关。它们是两个独立的实体,具有不同的属性。
下面是 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();
我与用户打交道的唯一地方是获取他们的列表,我正在做 AsNoTracking。
答:
-1赞
Perringaiden
11/7/2023
#1
首先,您可以用以下方法替换大量检查:
if (string.IsNullOrEmpty(contact.FirstName))
{
contact.FirstName = "FirstName";
}
其次,错误似乎出在关系上,而不是表上。我假设您的表没有在数据库中调用,但您可能希望检查关系而不是此特定函数。Users
Contacts
Contacts
Users
评论
0赞
Gert Arnold
11/7/2023
这基本上是两条评论,而不是答案。此外,第二条评论是基于一个不正确的假设。它是关于“用户”的关系,即用关系数据库术语来说:表。不是关系。像往常一样,在问题足够清楚之前,最好不要回答(在这种情况下:至少显示类及其映射)。Contact
0赞
ajzbrun
11/7/2023
@GertArnold是对的,联系人和用户表在我的项目中是不同的东西,我认为我没有说过它们是相同的。
0赞
Panagiotis Kanavos
11/7/2023
@ajzbrun你暗示他们只是发布代码并询问它发生了什么,而不是用户。不要强迫人们猜测,发布 Contact 和 User 对象,以及填充 .那里出了点问题Contact
Contact.Users
0赞
ajzbrun
11/7/2023
@PanagiotisKanavos我没有暗示用户与通讯录有关,请仔细阅读问题。我刚刚更新了 Contact 类。
1赞
ajzbrun
11/8/2023
#2
自动回答我的问题并提供解决方案。
问题在于,Entity Framework 正在考虑将该值视为在上下文中保存更改时要创建的新用户。LinkedUser
这是最后一个有效的代码块:
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;
///this new line solved the problem
contact.LinkedUser = null;
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();
感谢一些用户对原始问题发表评论并引导我找到解决方案。
评论
User
Contact
User.FirstName
Contact.Users
String.IsNullOrWhitespace()
relation "Users"
Contacts
Contact
Users
null value in column "FirstName" of relation "Users"
_context.Contacts.AddRangeAsync(contacts)
User
_mapper.Map<Contact>(row)
contact