指定的架构无效.错误:没有加载关系,因为类型不可用
本文关键字:关系 加载 因为 类型 无效 错误 | 更新日期: 2023-09-27 17:52:34
我希望在我的Order
模型中引用OrderAddress
模型两次;一次作为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; }
}
<<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)
{
...
}
}