1

我正在使用现有的数据库,我很不幸无法更改,并且似乎无法创建关系。我对EF相对来说比较陌生,经过一些搜索发现用户想要实现类似的功能,但是在这种情况下,所给出的建议似乎不起作用。使用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字段都与地址类中的Id相关,但不幸的是没有在数据库中设置为外键。

我相信我试图实现的关系是多方面的。即一个订单有一个发货地址(地址),但地址可以是许多订单的发货地址。

我试过以下的多种变化:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

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

} 

但每次我尝试访问Order.ShippingAddress.FirstName的时候,我得到一个空引用异常。

是我想要实现的可能吗?

+0

你是先使用代码吗? – dakait 2013-03-08 10:02:33

回答

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; } 
+0

谢谢你。我现在得到一个InvalidOperationException。 '指定的包含路径无效。 EntityType'Model.Order'不声明名为'ShippingAddress'的导航属性。我可能会错过显而易见的东西,但我确定我已经宣布了它? – rmorrin 2013-03-08 10:22:00

+1

@rmorrin您是否将密钥更改为可空?从你在这里所说的话你在你实际的导航属性设置中有点不习惯。从你上面的例子来看,这是我能看到的唯一问题。我也假设你也有一个类似的模型绑定的billingAddress – 2013-03-08 10:41:00