Fre*_*III 30 c# asp.net-mvc entity-framework fluent foreign-keys
我想在我的OrderAddress模型中两次引用该Order模型; 曾经作为一个ShippingAddress和一个作为一个BillingAdress.
另一方面,我希望我的OrderAddress模型有一个列表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; }
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行Update-Database时,出现以下错误:
指定的架构无效.错误:未加载关系"MyApp.Domain.DAL.Order_ShippingAddress",因为"MyApp.Domain.DAL.OrderAddress"类型不可用.
我究竟做错了什么?
Chr*_*att 43
这个错误有点神秘,所以我不确定这是否是你得到那个特定错误的原因,但我知道这会导致一些错误,所以你可以先解决这个问题:
你拥有的是一个类中同一模型的两个一对多关系.这本身并不是问题,但你必须将它们视为独立的.换句话说,它们不能都具有相反的关系Orders,因为在关系上,没有办法知道哪个外键关系应该填充该列表.如果你只是你的流利的API定义更改为类似.WithMany(t => t.Orders_Shipping)和.WithMany(t => t.Orders_Billing),我认为这将清理你的错误.
您需要将您的OrderAddress实体和Fluent API映射更改为以下内容:
订单地址:
public class OrderAddress : BaseModel
{
...
public virtual ICollection<Order> BillingOrders { get; set; }
public virtual ICollection<Order> ShippingOrders { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
流利的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);
}
Run Code Online (Sandbox Code Playgroud)
检查此SO帖子以获取更多信息,它与您的问题差不多。
| 归档时间: |
|
| 查看次数: |
34723 次 |
| 最近记录: |