用EF映射现有数据库中的关系
本文关键字:关系 数据库 EF 映射 | 更新日期: 2023-09-27 18:03:09
我正在使用我不幸无法更改的现有数据库,并且似乎在创建关系时遇到麻烦。我对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
}
我希望能够通过订单中的导航属性访问Shipping/Billing地址。ShippingAddressId
/BillingAddressId
字段都与地址类中的Id
相关,但不幸的是没有在数据库中设置为外键。
我相信我正在努力实现的关系是多方面的。例如,一个订单只有一个收货地址(Address),但一个Address可以是多个订单的收货地址。
我尝试了以下的多种变体:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().HasOptional(o => o.ShippingAddress)
.WithMany()
.HasForeignKey(o => o.ShippingAddressId);
}
但是每次我尝试访问Order.ShippingAddress。我得到一个空引用异常
我想要达到的是可能的吗?
如果你已经禁用了延迟加载,你需要在你的查询中'包含' navigation属性
你可以使用以下命令之一:
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; }