簡體   English   中英

指定的架構無效。 錯誤:未加載關系,因為類型不可用

[英]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; }

}

流利的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);
}

當我嘗試運行 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 文件。
  • 右鍵單擊它。
  • 選擇“從數據庫更新模型...”。
  • 單擊“刷新”選項卡。
  • 單擊完成按鈕。

您的 edmx 現在應該使用最新的數據庫更改進行更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM