最近都在使用可空引用类型去创建实体,但是使用了可空引用类型后并不给List<T>默认实例化
然后再直接使用List<T>.Add且不给值指定可空修饰符就会报错:Object reference not set to an instance of an object.
C#
public List<Comment>? Comments { get; set; }
Article a1 = new();
a1.Title = "肯德基疯狂星期四";
a1.Content = "V我50";
Comment c1 = new() { Message = "微信收款到账50元" };
Comment c2 = new() { Message = "Wechat收款500元"};
Comment c3 = new() { Message = "支持!" };
a1.Comments.Add(c1);
a1.Comments.Add(c2);
a1.Comments.Add(c3);
using BookDbContext db = new ();
db.Articles.Add(a1);
await db.SaveChangesAsync();
接着我们来试试给List<T>.Add加上可空修饰符
C#
public List<Comment>? Comments { get; set; }
Article a1 = new();
a1.Title = "肯德基疯狂星期四";
a1.Content = "V我50";
Comment c1 = new() { Message = "微信收款到账50元" };
Comment c2 = new() { Message = "Wechat收款500元"};
Comment c3 = new() { Message = "支持!" };
a1.Comments?.Add(c1);
a1.Comments?.Add(c2);
a1.Comments?.Add(c3);
using BookDbContext db = new ();
db.Articles.Add(a1);
await db.SaveChangesAsync();
好的,现在虽然不会报错,但是我查看了这些代码的执行结果,并没有执行正确的结果,数据表还是为空。
接着我们尝试使用默认值或者在执行代码中给定一个默认值或者为所用到的值显式实例化List<T>
C#
public List<Comment>? Comments { get; set; } = [];
OR
Article a1 = new();
a1.Title = "肯德基疯狂星期四";
a1.Content = "V我50";
Comment c1 = new() { Message = "微信收款到账50元" };
Comment c2 = new() { Message = "Wechat收款500元"};
Comment c3 = new() { Message = "支持!" };
a1.Comments = [c1, c2, c3];
using BookDbContext db = new ();
db.Articles.Add(a1);
await db.SaveChangesAsync();
OR
Article a1 = new();
a1.Title = "肯德基疯狂星期四";
a1.Content = "V我50";
Comment c1 = new() { Message = "微信收款到账50元" };
Comment c2 = new() { Message = "Wechat收款500元"};
Comment c3 = new() { Message = "支持!" };
a1.Comments = new List<Comment> { c1, c2, c3 };
using BookDbContext db = new ();
db.Articles.Add(a1);
await db.SaveChangesAsync();
都可以获取到正确的结果!