关系列中的 Null 值违反了非 null 约束 .net EF

Null value in column of relation violates not-null constraint .net EF

提问人:ajzbrun 提问时间:11/7/2023 最后编辑:ajzbrun 更新时间:11/9/2023 访问量:99

问:

我有这个代码:

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 的联系人。contactsFirstName

更新:

“联系人”表与“用户”表无关。它们是两个独立的实体,具有不同的属性。

下面是 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。

C# .NET PostgreSQL 框架实体 框架

评论

1赞 Akash Kava 11/7/2023
联系人是否来自用户?或者您是否必须自动添加用户以及忘记将名字/姓氏从联系人复制到用户的联系人?
2赞 odaiwa 11/7/2023
你能为联系人和用户提供模型结构吗
0赞 Panagiotis Kanavos 11/7/2023
您没有发布 或 课程。该错误似乎抱怨通过 访问。顺便说一句,您可以使用它来检查字符串是否为 null、空格或空UserContactUser.FirstNameContact.UsersString.IsNullOrWhitespace()
0赞 Panagiotis Kanavos 11/7/2023
该错误抱怨 。由于您将对象直接附加到一个必须假设具有关系。错误显示“通讯录”中没有relation "Users"ContactsContactUsersnull value in column "FirstName" of relation "Users"
1赞 Gert Arnold 11/7/2023
最后,它变得更加清晰了。现在的假设是,还会添加没有任何信息的新对象,只是因为创建了具有空用户的对象。正如你所看到的,在其他人开始分析问题之前,就涉及很多细节。_context.Contacts.AddRangeAsync(contacts)User_mapper.Map<Contact>(row)contact

答:

-1赞 Perringaiden 11/7/2023 #1

首先,您可以用以下方法替换大量检查:

if (string.IsNullOrEmpty(contact.FirstName)) 
{
    contact.FirstName = "FirstName";
}

其次,错误似乎出在关系上,而不是表上。我假设您的表没有在数据库中调用,但您可能希望检查关系而不是此特定函数。UsersContactsContactsUsers

评论

0赞 Gert Arnold 11/7/2023
这基本上是两条评论,而不是答案。此外,第二条评论是基于一个不正确的假设。它是关于“用户”的关系,即用关系数据库术语来说:表。不是关系。像往常一样,在问题足够清楚之前,最好不要回答(在这种情况下:至少显示类及其映射)。Contact
0赞 ajzbrun 11/7/2023
@GertArnold是对的,联系人和用户表在我的项目中是不同的东西,我认为我没有说过它们是相同的。
0赞 Panagiotis Kanavos 11/7/2023
@ajzbrun你暗示他们只是发布代码并询问它发生了什么,而不是用户。不要强迫人们猜测,发布 Contact 和 User 对象,以及填充 .那里出了点问题ContactContact.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();

感谢一些用户对原始问题发表评论并引导我找到解决方案。