EfCore OwnsOne เมล็ดพันธ์ nullable™à§à±à•à-à ล้มเหลว

0

คำถาม

ฉันต้องการเพื่อเมล็ดพันธ์ข้อมูลกับ EfCore ต้องของฉันเป็นเจ้าของ Entities ใครจะเป็น nullable

Entities:

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; }
}

รุ่นของการปรับแต่งสำหรับ DbContext:

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 }));
    });
}

ตอนที่ฉันพยายามจะสร้างของฉัน migration กับ:

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

ฉันได้รับข้อผิดพลาด:

อร์ดของดินแดนเวลทั้งรายการสำหรับรายการชนิด'OwnedEntityLevel1'ไม่สามารถเพิ่มเพราะว่าไม่มีค่าเป็นเตรียมไว้ให้สำหรับการทรัพย์สิน'หมายเลข'.

ข้อความ oviously นถูกต้อง แต่ฉันไม่เข้าใจถ้าคุณสามารถเมล็ดพันธ์ nullable กับวัตถุ .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();

ฉันของฉันปกติโครงการไหลเวียนฉันสามารถเพิ่ม nullable วัตถุไม่มีปัญหา:

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

ฉันต้องสร้างมีขนาดเล็กที่สุด reproducible ตัวอย่างที่นี่: 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 ทรัพย์สินของ seeded รายการ(Nullable<Guid> inferred จาก ?. โอเปอเรเตอร์กับ Guid)จึงไม่ใช่แผนไว้และมันกำลังสร้างที่สับสนเกิดข้อผิดพลาดข้อความไว้

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

คำตอบคือต้องสร้างและ populate น Guid Id ทรัพย์สินที่ไม่ระบุชื่อประเภทโดยคนแรกกำลังกรองออกไป null วัตถุ,e.g.(โพรโทคอล aimcomment ให้อภัยใครโอเปอเรเตอร์ถูกใช้เพื่อใช้ในการยับยั้ง 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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่