在.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
相关产品推荐
相关产品推荐

