EfCore OwnsOne tohum geçersiz kılınabilir nesneler başarısız oluyor

0

Soru

Sahip Olduğum Varlıklara EfCore ile veri tohumlamak istiyorum nullable

Varlıklar:

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 için model yapılandırması:

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

Geçişimi oluşturmaya çalıştığımda:

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

hatayı alıyorum:

'OwnedEntityLevel1' varlık türü için başlangıç varlığı, gerekli 'Id'özelliği için değer sağlanmadığı için eklenemez.

Mesaj açıkça doğru. Ancak geçersiz kılınabilir nesneleri tohumlayıp tohumlayamayacağınızı anlamıyorum .HasData nedense?

Tohumlamaya çalıştığım veriler:

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

Normal program akışımda sorun yaşamadan geçersiz nesneler ekleyebilirim:

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

Burada en az tekrarlanabilir bir örnek oluşturdum: https://github.com/enterprisebug/EfCoreHasDataNestedOwnedTypes/tree/main/EfCoreHasDataNestedOwnedTypes/NullableObject

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

En iyi cevabı

2

Anonim türlerle model veri tohumlaması, özellikleri hem ada hem de türe göre eşleştirir.

Sizin durumunuzda, tohumlama türü çağrılan özelliğe sahip olsa bile Id, onun tipi türünden farklıdır Id tohumlu varlığın mülkiyeti (Nullable<Guid> çıkarım ?. operatör vs Guid), bu nedenle eşlenmez ve kafa karıştırıcı hata iletisini oluşturur.

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

Çözüm, bir tane oluşturmak ve doldurmaktır. Guid Id önce filtreleyerek anonim türdeki özellik null nesneler, örn. (NRT uyarısını bastırmak için null affetme işleci kullanılır):

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

Teşekkürler! Bu benim sorunumu çözdü. Açıklama için de teşekkürler! Filtrelemek null değerler süper basit bir çözümdür. Hiç aklıma gelmemişti! Katkınız için gerçekten teşekkür ederim!
Daniel

Diğer dillerde

Bu sayfa diğer dillerde

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