【发布时间】:2011-03-30 17:02:50
【问题描述】:
我有一个用户可以有多个地址的情况。因此,我的用户类上有一个 ICollection。但我也希望用户能够选择默认地址。所以我做了以下事情:
public class User
{
public int Id { get; set; }
public int? DefaultAddressId { get; set; }
[ForeignKey("DefaultAddressId")]
public virtual Address DefaultAddress { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
//properties were removed for purpose of this post
}
我想完全删除 public virtual Address DefaultAddress { get; set; },保留 DefaultAddressId 并使用 Fluent API 映射它,因为当前设置会造成很多麻烦(在这个类和我有类似设置的其他类中)。那么这可以使用fluent api来完成吗?
更新: address 类目前没有对 User 类的任何引用,它是一种单向关系。但是,是的,一个地址只属于一个用户,它不是多对多的关系。这是地址类:
public class Address
{
public int Id { get; set; }
public string Name { get; set; }
public string Details { get; set; }
public virtual Area Area { get; set; }
}
【问题讨论】:
-
Address类的外观如何?它是否引用了单个User,以便每个地址都唯一地属于一个用户?或者用户可以共享一个地址,在这种情况下我期望一个多对多的关系? -
@Slauma:我刚刚更新了这个问题。请检查一下。
-
为什么
public virtual Address DefaultAddress { get; set; }有问题?在我看来,这个属性是表达你想要的关系的最佳方式——我看不出将它映射到数据库的问题。如果您删除该属性(并且在 Address 类中没有User属性),DefaultAddressId基本上就变成了一个根本不参与关系的标量属性。因此,您将丢失数据库中的外键约束检查(每个数字都可以在此属性中,无论是否存在具有此 ID 的地址)。 -
@Slauma:我不确定为什么会有问题。除了我尚未解决的其他问题外,它在升级到 EF 4.1 之前运行良好。 refer to this question
-
我已经在您的问题中测试了您的模型,它对我来说效果很好。这个模型实际上正是我选择使用地址集合和默认地址的解决方案。我相信,您的并发症在其他地方。
标签: entity-framework ef-code-first entity-framework-4.1 fluent-interface