EfCore OwnsOne semences nullable objets à défaut

0

La question

Je veux des graines de données avec EfCore à mon Entités qui peuvent être nullable

Entités:

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

Modèle de configuration pour 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 }));
    });
}

Lorsque j'essaie de créer ma migration avec:

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

je reçois l'erreur:

La graine de l'entité par entité de type 'OwnedEntityLevel1' ne peut pas être ajouté, car aucune valeur n'a été fourni pour la propriété "Id".

Le message oviously est correct. Mais je ne comprends pas, si vous pouviez semences nullable objets avec .HasData en quelque sorte?

Les données que je suis en train de semences:

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

J'ai mon flux de programme normal que je peux ajouter, nullable objets sans problème:

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

J'ai créé un minimum reproductible exemple ici: https://github.com/enterprisebug/EfCoreHasDataNestedOwnedTypes/tree/main/EfCoreHasDataNestedOwnedTypes/NullableObject

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

La meilleure réponse

2

Modèle de données de l'ensemencement avec des types anonymes matchs de propriétés à la fois le nom et le type.

Dans votre cas, même si le semis, type de a bien appelé Idson type est différent du type de la Id propriété de la tête de l'entité (Nullable<Guid> inférée à partir de ?. opérateur vs Guid), donc n'est pas mappé et génère de la confusion de message d'erreur.

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

La solution est de générer et de remplir un Guid Id bien dans le type anonyme par filtrant d'abord null objets, par exemple (null pardonner opérateur est utilisé pour supprimer le NRT avertissement):

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

Merci! Qui a résolu mon problème. Merci pour l'explication, aussi bien! Le filtrage des null les valeurs est la super solution simple. Je n'ai jamais pensé! Vraiment vous remercie de votre entrée!
Daniel

Dans d'autres langues

Cette page est dans d'autres langues

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