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

时间:2014-03-24 12:56:33

标签: c# asp.net-mvc entity-framework foreign-keys fluent

我希望在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; }
}

订单型号


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; }

}

Fluent 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时,出现以下错误:

  

指定的架构无效。错误:关系&#39; MyApp.Domain.DAL.Order_ShippingAddress&#39;未加载,因为类型&#39; MyApp.Domain.DAL.OrderAddress&#39;不可用。

我做错了什么?

8 个答案:

答案 0 :(得分:42)

错误有点神秘,所以我不确定这是否是您收到该特定错误的原因,但我知道这会导致某些错误,因此您可以启动通过解决这个问题:

你所拥有的是一个类中同一模型的两个一对多关系。这本身并不是问题,但你必须将它们视为独立的。换句话说,它们不能都具有Orders的相反关系,因为在关系上,没有办法知道哪个外键关系应该填充该列表。如果您只是将流畅的API定义更改为.WithMany(t => t.Orders_Shipping).WithMany(t => t.Orders_Billing),我认为这样可以解决您的错误。

答案 1 :(得分:4)

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

<强> OrderAddress:

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

Fluent 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 post了解更多信息,与您的问题大致相同。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

public partial class Vehicle
{
    public string Name { get; set; }
    public string Make { get; set; }
    ...
}

public partial class VEhicle
{
    public override bool Equals(object obj)
    {
       ...
    }
}

答案 4 :(得分:0)

我首先使用数据库得到了相同的错误:“由于类型...不可用,因此未加载关系”。问题是解决方案中的模型已经过时。解决问题:

  • 双击解决方案下的edmx文件。
  • 右键单击它。
  • 选择“从数据库更新模型...”。
  • 点击“刷新”标签。
  • 单击“完成”按钮。

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

答案 5 :(得分:0)

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

1 - 检查每个关系的ICollection,List,...关系集合。

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

首先使用3-in代码,检查您的EntityTypeConfiguration

答案 6 :(得分:0)

就我而言,问题是由于表名冲突

我有另一个edmx模型,其中有一些名称相似的表。 只需在设计器中单击表格,然后在属性中更改名称即可!

答案 7 :(得分:-1)

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

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