postgresql 关系列中的值违反非空约束.net EF

sshcrbum  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(171)

我有这样的代码:

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的身份来做的。

u4vypkhs

u4vypkhs1#

自动回答我的问题与解决方案。
问题是Entity Framework将LinkedUser值视为在上下文中保存更改时创建的新User。
这是最后的代码块工作:

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();

字符串
感谢一些用户对原始问题的评论,并引导我找到解决方案。

3hvapo4f

3hvapo4f2#

首先,您可以将大量检查替换为:

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

字符串
其次,错误似乎与Users关系有关,而不是Contacts表。我假设您的Contacts表在数据库中不称为Users,但您可能希望检查关系而不是此特定函数。

相关问题