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

本文关键字:关系 加载 因为 类型 无效 错误 | 更新日期: 2023-09-27 17:52:34

我希望在我的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<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; }
}
<<h2>流利的API/h2>
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相反的关系,因为从关系上讲,没有办法知道哪个外键关系应该填充该列表。如果你只是简单地改变你的流畅API定义像.WithMany(t => t.Orders_Shipping).WithMany(t => t.Orders_Billing),我认为这将澄清你的错误。

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

OrderAddress:

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帖子了解更多信息,它和你的问题差不多。

我得到了相同的错误使用数据库第一:"关系没有加载,因为类型…Is not available"。问题是解决方案中的模型已经过时了。修复方法:

    双击解决方案下的edmx文件。
  • 右键点击
  • 选择"Update Model from Database…"
  • 点击"刷新"选项卡。
  • 点击完成按钮。

您的edmx现在应该使用最新的数据库更改进行更新。

这在自关系实体中很常见。在本例中:

1-check to have ICollection, List,…

2-check关系集合的名称。

首先,检查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)
    {
       ...
    }
}