webentwicklung-frage-antwort-db.com.de

Das angegebene Schema ist nicht gültig. Fehler: Die Beziehung wurde nicht geladen, weil der Typ nicht verfügbar ist

Ich möchte das OrderAddress-Modell zweimal in meinem Order-Modell referenzieren. einmal als ShippingAddress und einmal als BillingAdress.

Auf der anderen Seite möchte ich, dass mein OrderAddress-Modell eine Liste von OrderAddresses enthält.

OrderAddress Model


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

Bestellmodell


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

}

Fließende API


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

Wenn ich versuche, Update-Database auszuführen, erhalte ich die folgende Fehlermeldung:

Das angegebene Schema ist nicht gültig. Fehler: Die Beziehung 'MyApp.Domain.DAL.Order_ShippingAddress' wurde nicht geladen, da der Typ 'MyApp.Domain.DAL.OrderAddress' nicht verfügbar ist.

Was mache ich falsch?

28

Der Fehler ist etwas kryptisch, daher bin ich mir nicht sicher, ob dies der Grund ist, warum Sie diesen bestimmten Fehler erhalten, aber ich weiß, dass er einige Fehler verursacht.

Sie haben zwei Eins-zu-Viele-Beziehungen zu demselben Modell in einer Klasse. Das ist an sich kein Problem, aber Sie müssen sie als getrennt behandeln. Mit anderen Worten, sie können nicht beide eine entgegengesetzte Beziehung von Orders haben, da relational keine Möglichkeit besteht, zu wissen, welche Fremdschlüsselbeziehung diese Liste füllen soll. Wenn Sie einfach Ihre fließende API-Definition in etwas wie .WithMany(t => t.Orders_Shipping) und .WithMany(t => t.Orders_Billing) ändern, wird dies Ihrer Meinung nach den Fehler beheben.

41
Chris Pratt

Sie müssen Ihre OrderAddress-Entität und Ihre Fluent-API-Zuordnungen folgendermaßen ändern:

Bestelladresse:

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

Fließende API:

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

Überprüfen Sie dies SO post für mehr, es geht um das gleiche Problem wie bei Ihnen.

4
Stacked

In meinem Fall hatte ich diesen Fehler, weil ich eine andere Teilklasse mit demselben Namen wie die vom Entity-Framework generierte Klasse erstellt habe. Außer dass mein Fall den Fall nicht erfüllt hat. Zum Beispiel:

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

Dies ist bei Selbstbeziehungsentitäten üblich. in diesem Fall:

1-Check, um eine ICollection-, List-, ...-Relationsammlung für jede Relation zu erhalten.

2-Check Name der Beziehungssammlungen.

3-in-Code überprüfen Sie zunächst Ihre EntityTypeConfiguration

0
Ali Mardan

Hatte dieses Problem. Ich glaube, es hat etwas mit dem Webservice zu tun. Meine Lösung war nach dem Update der Servicereferenz und der Konfigurationsoperation. das Problem ging weg. hoffe das hilft.

0

Ich habe den gleichen Fehler zuerst bei der Datenbank erhalten: "Die Beziehung wurde nicht geladen, weil der Typ ... nicht verfügbar ist". Das Problem war, dass das Modell in der Lösung veraltet war. Um das Problem zu lösen:

  • Doppelklicken Sie unter Lösung auf die edmx-Datei. 
  • Klicken Sie mit der rechten Maustaste darauf.
  • Wählen Sie "Modell aus Datenbank aktualisieren ...".
  • Klicken Sie auf die Registerkarte "Aktualisieren".
  • Klicken Sie auf die Schaltfläche Fertig stellen.

Ihr edmx sollte jetzt mit den neuesten Datenbankänderungen aktualisiert werden.

0
live-love