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

Fre*_*III 30 c# asp.net-mvc entity-framework fluent foreign-keys

我想在我的OrderAddress模型中两次引用该Order模型; 曾经作为一个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; }
}
Run Code Online (Sandbox Code Playgroud)

订单模型


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

}
Run Code Online (Sandbox Code Playgroud)

流畅的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);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行Update-Database时,出现以下错误:

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

我究竟做错了什么?

Chr*_*att 43

这个错误有点神秘,所以我不确定这是否是你得到那个特定错误的原因,但我知道这会导致一些错误,所以你可以先解决这个问题:

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

  • 更详细的解释http://stackoverflow.com/questions/5559043/entity-framework-code-first-two-foreign-keys-from-same-table (2认同)
  • @Brent:你的评论有点令人困惑.首先,我使用Fluent配置,因为这是OP已经使用的.您也可以使用基于属性的配置解决问题.但是,没有办法让两个关系共享相同的属性名称.如果你以这种方式配置它,它可能"工作",因为你没有得到错误,但一个关系或另一个将获得对该属性的独占访问权限,而不是两者. (2认同)

Sta*_*ked 5

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

订单地址:

public class OrderAddress : BaseModel
{
    ...
    public virtual ICollection<Order> BillingOrders { get; set; }
    public virtual ICollection<Order> ShippingOrders { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

流利的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);
}
Run Code Online (Sandbox Code Playgroud)

检查此SO帖子以获取更多信息,它与您的问题差不多。