EfCore OwnsOne种可空物体失败

0

的问题

我想种子数据与EfCore到我拥有的实体中谁可以 nullable

实体:

public class RootEntity
{
    protected RootEntity() { }

    public Guid Id { get; set; }

    public OwnedEntityLevel1? OwnedEntityLevel1 { get; set; } // can be nullable
}

public class OwnedEntityLevel1
{
    public Guid Id { get; set; }
}

模型配置,用于代码的第:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<RootEntity>(b =>
    {
        b.OwnsOne(x => x.OwnedEntityLevel1, ob =>
        {
            ob.HasData(RootEntity.All.Select(x => new
                { x.OwnedEntityLevel1?.Id, RootEntityId = x.Id }));
        });
        b.HasData(RootEntity.All.Select(x => new { x.Id }));
    });
}

当我试图创造我的迁移:

dotnet ef migrations add Initial --context NullableObjectDbContext -o Migrations/NullableObject

我收到错误:

这种实体对实体的类型'OwnedEntityLevel1'不能加入,因为没有任何价值提供了所需的财产'Id'。

消息oviously是正确的。 但我不明白如果你能子可空物体与 .HasData 不知怎的?

数据,我想种子:

public static RootEntity PredefinedEntity11 { get; } =
    new(
        Guid.Parse("96e1d442-bdd0-4c6f-9d01-624b27abbac3"),
        new OwnedEntityLevel1
        {
            Id = Guid.Parse("8f8eea73-0b43-412a-b0aa-a9338db6e067")
        }
    );

public static RootEntity PredefinedEntity12 { get; } =
    new(
        Guid.Parse("aae51dac-016e-472e-ad51-2f09f8cb9fbb"),
        null! // When i add this the migration fails with The seed entity for entity type 'OwnedEntityLevel1' cannot be added because no value was provided for the required property 'Id'
    );

public static IReadOnlyList<RootEntity> All { get; } =
    new List<RootEntity>(new[] { PredefinedEntity11, PredefinedEntity12 }).AsReadOnly();

我我正常的程序流程,我可以添加可空物体而不是一个问题:

var ctx = new NullableObjectDbContext();
var rootEntity = new RootEntity(Guid.NewGuid(), null);
ctx.Add(rootEntity);
ctx.SaveChanges();

我已经创建了一个最小的可重复的例子来说明: https://github.com/enterprisebug/EfCoreHasDataNestedOwnedTypes/tree/main/EfCoreHasDataNestedOwnedTypes/NullableObject

ef-code-first entity-framework-core
2021-11-23 07:30:51
1

最好的答案

2

模型数据播 与匿名类型的匹配性,通过 两个 的姓名和 类型.

在你的情况,尽管种类型都有所谓的酒店 Id其类型是不同的类型 Id 酒店的接种实体(Nullable<Guid> 推断 ?. 操作员vs Guid),因此是不映射,并产生混乱的错误信息。

new
{ 
    x.OwnedEntityLevel1?.Id, // Guid? Id
    RootEntityId = x.Id      // Guid RootEntityId 
}

该方案是产生和填充 Guid Id 酒店的匿名类型的第一个筛选出来 null 对象,例如(null宽容的操作者是用来抑制NRT警告):

ob.HasData(RootEntity.All
    .Where(x => x.OwnedEntityLevel1 != null)
    .Select(x => new
    { 
        x.OwnedEntityLevel1!.Id, // Guid Id
        RootEntityId = x.Id      // Guid RootEntityId
    }));
2021-11-23 08:43:17

谢谢! 解决我的问题。 谢谢你的解释。 过滤出来的 null 值超简单的解决方案。 我从来没有想过这个问题! 真的很感激你的输入!
Daniel

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................