实体类型 XXX 是使用表共享的可选依赖项,无需任何必需的非共享属性...'即使需要关系时

问题描述 投票:0回答:1

我有两个实体映射到同一个表。这些实体不共享导航属性,但配置了一对一的关系。

为什么我收到此警告:

实体类型“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);
    }
}
c# .net entity-framework entity-framework-core ef-core-7.0
1个回答
0
投票

警告是说,如果依赖实体使用的所有属性(即

MaterialInfo2
)都在数据库中,则在查询该行时不会为该依赖实体创建实例。
在这种情况下,由于不涉及导航属性,我认为我们可以忽略该警告(我来到这里是因为同样的

NULL

)。

来自

高级表映射

如果数据库中依赖实体使用的所有列均为 NULL,则查询时不会创建它的实例。这允许对可选的依赖实体进行建模,其中主体上的关系属性将为空。请注意,如果所有依赖项的属性都是可选的并设置为 null,也会发生这种情况,这可能是意想不到的。

但是,额外的检查可能会影响查询性能。此外,如果依赖实体类型具有其自己的依赖项,则确定是否应创建实例就变得非常重要。为了避免这些问题,可以将依赖实体类型标记为必需,请参阅必需的一对一依赖关系以获取更多信息。

如果导航属性确实存在,我认为我们必须强制为依赖实体创建实例的方法是执行以下操作:

WRN

© www.soinside.com 2019 - 2024. All rights reserved.