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.
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; }
}
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; }
}
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?
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.
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.
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)
{
...
}
}
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
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.
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:
Ihr edmx sollte jetzt mit den neuesten Datenbankänderungen aktualisiert werden.