You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.NET 6 EF中插入无关联书籍的作者时如何避免空引用异常

问题分析与解决

异常触发点及修复方案

1. 实体类命名与导航属性不匹配

你的书籍实体类用了复数Books,但EF Core默认遵循单数命名约定(应为Book);同时作者类中的导航属性Book应该对应复数集合Books,命名不匹配会导致EF Core映射逻辑出错,间接引发空引用异常。

修复后的实体类代码:

public class Author
{
    public Guid Id { get; set; }
    public string Name { get; set; } // 首字母大写符合C#编码规范
    public ICollection<Book>? Books { get; set; } = new List<Book>(); // 改为复数集合名
}

public class Book // 改为单数类名
{
    public Guid Id { get; set; }
    public int Page { get; set; }
    public string? Name { get; set; }
    public Author? Author { get; set; }
    public Guid AuthorId { get; set; }
}

同步更新关系配置中的导航属性引用:

modelBuilder.Entity<Author>()
            .HasMany(u => u.Books) // 对应修改后的复数集合属性
            .WithOne(a => a.Author)
            .HasForeignKey(aa => aa.AuthorId)
            .OnDelete(DeleteBehavior.Cascade);

2. request.Author对象为空

检查插入逻辑中request.Author是否未正确初始化(比如请求参数绑定失败),直接调用_context.Author.Add(null)会触发空引用异常。

修复:添加非空校验,确保对象有效:

if (request.Author == null)
{
    throw new ArgumentNullException(nameof(request.Author));
}
_context.Author.Add(request.Author);
await _context.SaveChangesAsync(); // 必须调用SaveChanges提交数据

3. Author的Name属性未赋值

Author类中的name是非可空string类型,如果插入时未给该属性赋值,EF Core在数据验证阶段可能抛出异常,部分场景下会被包装为空引用表现形式。

修复:要么确保插入的Author对象Name属性有有效值,要么根据业务需求改为可空类型:

public string? Name { get; set; }

验证修复后的插入逻辑

插入无关联书籍的作者代码示例:

var newAuthor = new Author
{
    Id = Guid.NewGuid(),
    Name = "示例作者"
    // 无需手动设置Books,已初始化空列表
};
_context.Author.Add(newAuthor);
await _context.SaveChangesAsync();

内容的提问来源于stack exchange,提问作者Keyaz Destroyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:15:51