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

时间:2013-03-08 09:55:33

标签: c# asp.net-mvc-3 entity-framework entity-framework-4 fluent-interface

我正在使用现有的数据库,我很遗憾无法更改,似乎无法创建关系。我对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时,都会得到一个空引用异常。

我想要实现的目标是什么?

1 个答案:

答案 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; }