1

我正在使用一个现有的数据库,很遗憾我无法更改,并且似乎在创建关系时遇到了麻烦。我对 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字段都与IdAddress 类有关,但遗憾的是没有在数据库中设置为外键。

我相信我正在努力实现的关系是多对一的。即一个订单有一个收货地址(Address),但一个地址可以是多个订单的收货地址。

我尝试了以下多种变体:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<Order>().HasOptional(o => o.ShippingAddress)
        .WithMany()
        .HasForeignKey(o => o.ShippingAddressId);

}

但是每次我尝试访问 Order.ShippingAddress.FirstName 时,都会收到一个空引用异常。

我想要实现的目标是可能的吗?

4

1 回答 1

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; }
于 2013-03-08T10:04:19.263 回答