EF Core Preview 7已经发布,我决定和C# 8预览版以及.NET Core 3.0预览版一起使用。假设我有一个表示多对多关系的类:
public class A
{
public int Id { get; set; }
public ICollection<Relation> Relations { get; set; }
}
public class B
{
public int Id { get; set; }
public ICollection<Relation> Relations { get; set; }
}
public class Relation
{
public A A { get; set; }
public B B { get; set; }
public int AId { get; set; }
public int BId { get; set; }
}
我会将它们映射为这样:
modelBuilder.Entity<A>(entity => entity.HasKey(e => e.Id));
modelBuilder.Entity<B>(entity => entity.HasKey(e => e.Id));
modelBuilder.Entity<Relation>(entity =>
{
entity.HasKey(e => new { e.AId, e.BId });
entity.HasOne(e => e.A).WithMany(a => a.Relations).HasForeignKey(e => e.AId);
entity.HasOne(e => e.B).WithMany(b => b.Relations).HasForeignKey(e => e.BId);
});
现在,由于我可能不想包括关系中的A
和B
类之一或两者,因此它们可以为null。因此,它们应该是可空的。
var relation = Set<Relations>().Include(r => r.A).First(); // relation.A is not null, but relation.B is null.
所以,我会将这个类重写为:
public class Relation
{
public A? A { get; set; }
public B? B { get; set; }
}
但现在模型构建将不起作用,因为以下这些行:
entity.HasOne(e => e.A).WithMany(a => a.Relations).HasForeignKey(e => e.AId);
entity.HasOne(e => e.B).WithMany(b => b.Relations).HasForeignKey(e => e.BId);
在全局范围内,我将
a.Relations
和b.Relations
的访问设置为转换为错误,因为这似乎是一件明智的事情,会引发CS8602-可能为空引用的解除引用
异常。请注意,从另一侧构建模型时,因此在A
和B
上配置HasMany
,将引发CS8603-可能为空引用返回
异常。我能够通过使用#pragma warning disable CS8602
来默默地解决问题,但这显然是一个权宜之计。对于这种使用情况来说,EF Core中的这种现象看起来像是一个“bad smell”,似乎合理且不会引发任何与null
有关的问题。然而,我在EF Core的github上没有找到这样的问题。因此,问题是,在当前的EF Core 3.0.0预览版7中,是否有一种方式可以具有可空导航属性而不在模型构建时引发警告?如果没有,则这确实是一个问题,我是否在EF Core的github上错过了这个问题,或者应该在那里提出问题?
#pragma warning
:( - V0ldekOnModelCreating
之前执行#nullable disable
,并在之后执行#nullable restore
。 - V0ldek