web-dev-qa-db-fra.com

Le schéma spécifié n'est pas valide. Erreurs: la relation n'a pas été chargée car le type n'est pas disponible

Je souhaite référencer le modèle OrderAddress deux fois dans mon modèle Order; une fois en tant que ShippingAddress et une fois en tant que BillingAdress.

De l'autre côté, je veux que mon modèle OrderAddress ait une liste de OrderAddresses.

Modèle d'adresse de commande


public enum AddressType
{
    Billing,
    Shipping,
    Contact
}
public class OrderAddress : BaseModel
{
    public AddressType AddressType { get; set; }
    public bool IsPrimary { get; set; }

    public string Address { get; set; }
    public string CityStateZip { get; set; }
    public string ContactName { get; set; }
    public string PhoneNumber { get; set; }
    public string FaxNumber { get; set; }
    public string EmailAddress { get; set; }

    public virtual ICollection<Order> Orders { get; set; }

    public virtual ApplicationUser User { get; set; }
}

Modèle de commande


public class Order : BaseModel
{
    public DateTime OrderDate { get; set; }

    public int BillingAddressId { get; set; }
    public virtual OrderAddress BillingAddress { get; set; }

    public int ShippingAddressId { get; set; }
    public virtual OrderAddress ShippingAddress { get; set; }

    public virtual ApplicationUser User { get; set; }

}

API Fluent


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Order>()
                .HasRequired(m => m.ShippingAddress)
                .WithMany(t => t.Orders)
                .HasForeignKey(m => m.ShippingAddressId)
                .WillCascadeOnDelete(false);

    modelBuilder.Entity<Order>()
                .HasRequired(m => m.BillingAddress)
                .WithMany(t => t.Orders)
                .HasForeignKey(m => m.BillingAddressId)
                .WillCascadeOnDelete(false);
}

Lorsque j'essaie d'exécuter Update-Database, j'obtiens le message d'erreur suivant:

Le schéma spécifié n'est pas valide. Erreurs: la relation 'MyApp.Domain.DAL.Order_ShippingAddress' n'a pas été chargée car le type 'MyApp.Domain.DAL.OrderAddress' n'est pas disponible.

Qu'est-ce que je fais mal?

28

L'erreur est un peu cryptique, donc je ne suis pas sûr que ce soit la raison pour laquelle vous obtenez cette erreur particulière, mais je sais que cela provoquera une erreur some , vous pouvez donc commencer par corriger ceci:

Ce que vous avez est deux relations un-à-plusieurs avec le même modèle sur une classe. Ce n'est pas un problème en soi, mais vous devez les traiter séparément. En d'autres termes, ils ne peuvent pas avoir une relation inverse de Orders, car il n'existe aucun moyen de savoir quelle relation de clé étrangère devrait figurer dans cette liste. Si vous modifiez simplement votre définition d'API fluide en quelque chose comme .WithMany(t => t.Orders_Shipping) et .WithMany(t => t.Orders_Billing), je pense que cela effacera votre erreur.

41
Chris Pratt

Vous devez modifier votre entité OrderAddress et vos mappages d'API Fluent comme suit:

OrderAddress:

public class OrderAddress : BaseModel
{
    ...
    public virtual ICollection<Order> BillingOrders { get; set; }
    public virtual ICollection<Order> ShippingOrders { get; set; }
    ...
}

API courante:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Order>()
                .HasRequired(m => m.ShippingAddress)
                .WithMany(t => t.ShippingOrders)
                .HasForeignKey(m => m.ShippingAddressId)
                .WillCascadeOnDelete(false);

    modelBuilder.Entity<Order>()
                .HasRequired(m => m.BillingAddress)
                .WithMany(t => t.BillingOrders)
                .HasForeignKey(m => m.BillingAddressId)
                .WillCascadeOnDelete(false);
}

Cochez cette SO post pour plus, il s’agit du même problème que le vôtre.

4
Stacked

Dans mon cas, j'ai eu cette erreur parce que j'ai créé une autre classe partielle avec le même nom que la classe générée par le framework entity Sauf que le mien n'a pas fait l'affaire. Par exemple:

public partial class Vehicle
{
    public string Name { get; set; }
    public string Make { get; set; }
    ...
}

public partial class VEhicle
{
    public override bool Equals(object obj)
    {
       ...
    }
}
0
user3711223

Ceci est commun dans les entités de relation de soi. dans ce cas:

1-cocher pour avoir ICollection, List, ... collection de relations pour chaque relation.

2-vérifier le nom des collections de relations.

Code 3 en premier, vérifiez votre EntityTypeConfiguration

0
Ali Mardan

Avait ce problème. Je crois que cela a quelque chose à voir avec le service Web. Ma solution était après la mise à jour de la référence de service et l'opération de configuration a eu lieu. le problème est parti. J'espère que cela t'aides.

0
Kirk Patrick Brown

La même erreur s'est produite lors de l'utilisation de la base de données: "La relation n'a pas été chargée car le type ... n'est pas disponible". Le problème était que le modèle de la solution était obsolète. Pour résoudre le problème:

  • Double-cliquez sur le fichier edmx sous Solution. 
  • Faites un clic droit dessus.
  • Sélectionnez "Mettre à jour le modèle à partir de la base de données ...".
  • Cliquez sur l'onglet "Actualiser".
  • Cliquez sur le bouton Terminer.

Votre edmx devrait maintenant être mis à jour avec les dernières modifications apportées à la base de données.

0
live-love