我正在使用现有的数据库,我很遗憾无法更改,似乎无法创建关系。我对EF相对较新,经过一些搜索后发现用户试图获得类似的东西,但是在这种情况下给出的建议似乎并不起作用。
我有以下课程:
public partial class Order
{
public int Id { get; set; }
public int BillingAddressId { get; set; }
public int ShippingAddressId { get; set; }
//more values
public virtual Address ShippingAddress { get; set; }
public virtual Address BillingAddress { get; set; }
}
public partial class Address
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
//more values
}
我希望能够通过订单中的导航属性访问送货/结算地址。 ShippingAddressId
/ BillingAddressId
字段都与Address类中的Id
相关,但遗憾的是,未在数据库中将其设置为外键。
我相信我想要实现的关系是多方面的。即订单有一个送货地址(地址),但地址可以是许多订单的送货地址。
我尝试了以下多种变体:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().HasOptional(o => o.ShippingAddress)
.WithMany()
.HasForeignKey(o => o.ShippingAddressId);
}
但每次我尝试访问Order.ShippingAddress.FirstName时,都会得到一个空引用异常。
我想要实现的目标是什么?
答案 0 :(得分:1)
如果您已禁用延迟加载,则需要在查询中“包含”导航属性
您可以使用以下方法之一执行此操作:
context.Orders.Include(o=>o.ShippingAddress).Where..... // make sure you are `using System.Data.Entity;`
context.Orders.Include("ShippingAddress").Where.....
此外,如果你的关系是可选的,你需要使FK id可以为空,例如:
public int? BillingAddressId { get; set; }
public int? ShippingAddressId { get; set; }