0

我有两个实体;让我们称他们为人员和地址。一个人只有一个当前地址[在此处插入有关政治候选人的笑话],但也有以前的地址,这些地址也存储在地址表中。因此,我希望我的数据库表具有 1:many 关系。

但是,在我的实体类中,我不希望 Person 和 Address 之间存在 1:many 关系,因为我只对他们当前的地址感兴趣。(如果我想知道他们以前的地址,那么我可以直接看地址表)。所以,我想要 Person 对象上的 1:many "Addresses" 属性。相反,我想要一个 1:1 地址属性,我将其设置为当前地址。

这可以做到吗?

4

2 回答 2

2

无法通过映射来做到这一点,因为 EF 关系紧跟 DB 关系。此外,EF 中的一对一关系基于将外键放在依赖表中的主键上(地址和人员需要具有完全相同的主键值),并且此要求不适用于您期望在表也​​是。

我会尝试这种方法(未经测试):

public class MyContext : DbContext {

    public MyContext() {
        ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
            (sender, e) => {
                var person = e.Person as Person;
                if (person != null) {
                    // Fill the property manually
                    person.Address = this.Addresses.FirstOrDefault(/* some condition */);
                }
    }

    protected override void OnModelCreating(DbModelBuilder builder) {
        // Do not map the propery
        builder.Entity<Person>().Ignore(p => p.Address);

        // other mapping
    }

    public override int SaveChanges() {

        // TODO: here you must have your own change tracking logic
        // for address to know when the address has changed and 
        // new record must be created in the database for old address

        return base.SaveChanges();
    }

    // rest of context class
}
于 2012-10-12T17:39:34.420 回答
0

不,这做不到。导航属性代表外键关系,数据库中的 FK 关系代表一个人的多个地址。当前地址是数据库中特定查询的结果,例如 - 根据“当前”的定义方式 - 对给定人员的所有地址进行“选择顶部(1)...按地址创建日期降序排序”查询。

我认为可能的解决方案是:

  • CurrentAddressId在人员表中使用引用当前地址的外键创建第二个关系。CurrentAddress然后你可以在你的Person课堂上有一个导航参考。
  • 或者执行查询以使用GetCurrentAddress(Person person)方法或类似方法加载存储库或服务类中的当前地址。但是你不能在Person类上拥有当前地址的导航属性。
于 2012-10-12T17:39:22.580 回答