我有两个实体映射到同一个表。这些实体不共享导航属性,但配置了一对一的关系。
为什么我收到此警告:
实体类型“MaterialInfo2”是使用表共享的可选依赖项,无需任何可用于识别实体是否存在的必需非共享属性。如果数据库中所有可为空的属性都包含空值,则不会在查询中创建对象实例。添加必需的属性以创建其他属性为空值的实例,或根据需要标记传入导航以始终创建实例
查看演示:https://dotnetfiddle.net/wt4BSQ
public partial class Material
{
public string MaterialCode { get; set; }
public string Popis { get; set; }
}
public class MaterialInfo2
{
public string MaterialCode { get; set; } = string.Empty;
public string Popis { get; set; }
}
public class MaterialConfiguration : IEntityTypeConfiguration<Material>
{
public void Configure(EntityTypeBuilder<Material> entity)
{
entity.ToTable("Material");
entity.HasKey(e => e.MaterialCode);
entity.Property(e => e.MaterialCode)
.HasColumnName("MaterialCode")
.HasMaxLength(25)
.IsRequired();
}
}
public class MaterialInfo2Configuration : IEntityTypeConfiguration<MaterialInfo2>
{
public void Configure(EntityTypeBuilder<MaterialInfo2> entity)
{
entity.ToTable("Material");
entity.HasKey(e => e.MaterialCode);
entity.Property(e => e.MaterialCode).
HasColumnName("MaterialCode")
.HasMaxLength(25)
.IsRequired();
entity.HasOne<Material>()
.WithOne()
.HasForeignKey<MaterialInfo2>(e => e.MaterialCode)
.HasPrincipalKey<Material>(e => e.MaterialCode)
.IsRequired(true);
}
}
警告是说,如果依赖实体使用的所有属性(即
MaterialInfo2
)都在数据库中,则在查询该行时不会为该依赖实体创建实例。在这种情况下,由于不涉及导航属性,我认为我们可以忽略该警告(我来到这里是因为同样的NULL
)。
来自高级表映射如果数据库中依赖实体使用的所有列均为 NULL,则查询时不会创建它的实例。这允许对可选的依赖实体进行建模,其中主体上的关系属性将为空。请注意,如果所有依赖项的属性都是可选的并设置为 null,也会发生这种情况,这可能是意想不到的。但是,额外的检查可能会影响查询性能。此外,如果依赖实体类型具有其自己的依赖项,则确定是否应创建实例就变得非常重要。为了避免这些问题,可以将依赖实体类型标记为必需,请参阅必需的一对一依赖关系以获取更多信息。
如果导航属性确实存在,我认为我们必须强制为依赖实体创建实例的方法是执行以下操作:
WRN