我希望在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; }
}
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;不可用。
我做错了什么?
答案 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。
答案 5 :(得分:0)
这在自我关系实体中很常见。在这种情况下:
1 - 检查每个关系的ICollection,List,...关系集合。
2 - 检查关系集合的名称。
首先使用3-in代码,检查您的EntityTypeConfiguration
答案 6 :(得分:0)
就我而言,问题是由于表名冲突。
我有另一个edmx模型,其中有一些名称相似的表。 只需在设计器中单击表格,然后在属性中更改名称即可!
答案 7 :(得分:-1)
我在这里有一个解决方案! 如果您使用EF,请执行以下操作,
打开model.edmx 然后右键单击它并从数据库更新模型。 最后构建应用程序并运行它。