用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。我得到一个空引用异常

我想要达到的是可能的吗?

用EF映射现有数据库中的关系

如果你已经禁用了延迟加载,你需要在你的查询中'包含' 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; }