[英]EF6 Schema specified is not valid. Errors: The relationship x was not loaded because the type y is not available
[英]Schema specified is not valid. Errors: The relationship was not loaded because the type is not available
我希望在我的Order
模型中兩次引用OrderAddress
模型; 一次作為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; }
}
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);
}
當我嘗試運行 Update-Database 時,出現以下錯誤:
指定的架構無效。 錯誤:關系“MyApp.Domain.DAL.Order_ShippingAddress”未加載,因為類型“MyApp.Domain.DAL.OrderAddress”不可用。
我究竟做錯了什么?
該錯誤有點神秘,所以我不確定這是否是您收到該特定錯誤的原因,但我知道它會導致一些錯誤,因此您可以從解決此問題開始:
您擁有的是一個類上同一個模型的兩個一對多關系。 這本身不是問題,但您必須將它們分開處理。 換句話說,它們不能同時具有相反的Orders
關系,因為從關系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; }
...
}
流暢的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);
}
查看此SO 帖子了解更多信息,它與您的問題大致相同。
這在自關系實體中很常見。 在這種情況下:
1-檢查每個關系的ICollection、List、...關系集合。
2-檢查關系集合的名稱。
3-in 代碼先,檢查你的 EntityTypeConfiguration
就我而言,問題是由於表名沖突。
我有另一個 edmx 模型,其中包含一些名稱相似的表。 只需單擊設計器中的表格,然后在屬性中將名稱更改為不同的名稱!
我在這里找到了一個解決方案! 如果您使用的是 EF,請執行以下操作,
打開 model.edmx 然后右鍵單擊它並從數據庫更新模型。 最后構建應用程序並運行它。
有這個問題。 我相信這與網絡服務有關。 我的解決方案是在更新服務引用並進行配置操作之后。 問題就解決了。 希望這可以幫助。
在我的情況下,我遇到了這個錯誤,因為我創建了另一個與實體框架生成的類同名的部分類。 除了我的不符合情況。 例如:
public partial class Vehicle
{
public string Name { get; set; }
public string Make { get; set; }
...
}
public partial class VEhicle
{
public override bool Equals(object obj)
{
...
}
}
我首先使用數據庫遇到了同樣的錯誤:“關系沒有加載,因為類型......不可用”。 問題是解決方案中的模型已經過時。 要解決問題:
您的 edmx 現在應該使用最新的數據庫更改進行更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.