I wish to reference the OrderAddress
model twice in my Order
model; once as a ShippingAddress
and once as a BillingAdress
.
On the other side, I want my OrderAddress
model to have a list of OrderAddresses
.
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);
}
When I try to run Update-Database, I get the following error:
Schema specified is not valid. Errors: The relationship 'MyApp.Domain.DAL.Order_ShippingAddress' was not loaded because the type 'MyApp.Domain.DAL.OrderAddress' is not available.
What am I doing wrong?
The error is a little cryptic, so I'm not sure if this is the reason you're getting that particular error, but I do know it will cause some error, so you can start by fixing this:
What you have is two one-to-many relationships to the same model on one class. That's not a problem per se, but you have to treat them as separate. In other words, they can't both have a opposite relationship of Orders
, because relationally, there's no way to know which foreign key relationship should populate that list. If you simply change your fluent API definition to something like .WithMany(t => t.Orders_Shipping)
and .WithMany(t => t.Orders_Billing)
, I think that will clear up your error.