指定的架构无效。 错误:未加载关系,因为类型不可用

我想在Order模型中引用OrderAddress模型两次 ; 一次作为ShippingAddress ,一次作为BillingAdress

另一方面,我希望我的OrderAddress模型有一个OrderAddresses列表。

OrderAddress模型


 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 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() .HasRequired(m => m.ShippingAddress) .WithMany(t => t.Orders) .HasForeignKey(m => m.ShippingAddressId) .WillCascadeOnDelete(false); modelBuilder.Entity() .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关系,因为在关系上,没有办法知道哪个外键关系应该填充该列表。 如果您只是将您的流畅API定义更改为.WithMany(t => t.Orders_Shipping).WithMany(t => t.Orders_Billing) ,我认为这将清除您的错误。

您需要将OrderAddress实体和Fluent API映射更改为以下内容:

OrderAddress:

 public class OrderAddress : BaseModel { ... public virtual ICollection BillingOrders { get; set; } public virtual ICollection ShippingOrders { get; set; } ... } 

流畅的API:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .HasRequired(m => m.ShippingAddress) .WithMany(t => t.ShippingOrders) .HasForeignKey(m => m.ShippingAddressId) .WillCascadeOnDelete(false); modelBuilder.Entity() .HasRequired(m => m.BillingAddress) .WithMany(t => t.BillingOrders) .HasForeignKey(m => m.BillingAddressId) .WillCascadeOnDelete(false); } 

查看此SOpost了解更多信息,与您的问题大致相同。

有这个问题。 我相信它与Web服务有关。 我的解决方案是在更新服务引用并进行配置操作之后。 问题消失了。 希望这可以帮助。

在我的情况下,我有这个错误,因为我创建了另一个与entity framework生成的类同名的部分类。 除了我没有匹配的情况。 例如:

 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现在应该使用最新的数据库更改进行更新。

这在自我关系实体中很常见。 在这种情况下:

1 – 检查每个关系的ICollection,List,…关系集合。

2 – 检查关系集合的名称。

首先在3-in代码中,检查您的EntityTypeConfiguration

我在这里有一个解决方案! 如果您使用EF然后执行以下操作,

打开model.edmx然后右键单击它并从数据库更新模型。 最后构建应用程序并运行它。