【问题标题】:Entity Framework and 0 to 1实体框架和 0 到 1
【发布时间】:2014-08-01 15:04:08
【问题描述】:

我有以下类和表结构:

  • 一个组件可以有 1 个人员 (PersonID)
  • 一个组件可以有 1 个组 (GroupID)
  • 一个组件可以有 1 个人和 1 个组
  • 一个人总是有一个组件
  • 一个组总是有一个组件

    公共类组件{ 公共人人{get;放;} 公共组组 { 得到;放; } }

    公共类人{ 公共组件组件 { 获取;放; } }

    公开课组{ 公共组件组件 { 获取;放; } }

我以这种方式映射这个结构:

public ComponentMap()
{
    this.ToTable("Component")
        .Property(x => x.Id)
        .HasColumnName("ComponentID");
}

public GroupMap()
{
    this.ToTable("Group")
        .Property(x => x.Id)
        .HasColumnName("GroupID");
    this.HasRequired(x => x.Component)
        .WithOptional(x => x.Group);
}

public PersonMap()
{
    this.ToTable("Person")
        .Property(x => x.Id)
        .HasColumnName("GroupID");
    this.HasRequired(x => x.Component)
        .WithOptional(x => x.Person);
}

如果我选择一个组或人员,则始终正确获取相关组件,但是当我选择一个组件时,使用组件 ID 而不是相对的 PersonID 或 GroupID 获取组 ID 和人员 ID。我在哪里可以说表格组件有 PersonID 和 GroupID?在组件映射内部?

表格是

**Component**
ComponentID
PersonID
GroupID

**Person**
PersonID

**Group**
GroupID

【问题讨论】:

    标签: entity-framework one-to-one


    【解决方案1】:

    我要使其正常工作的唯一解决方案是以下映射

    this.ToTable("Component")
        .Property(x => x.Id)
        .HasColumnName("PartyID");
    this.HasRequired(x => x.Person)
        .WithRequiredDependent(x => x.Component)
        .Map(cfg => cfg.MapKey("PersonID"));
    this.HasRequired(x => x.Organization)
        .WithRequiredDependent(x => x.Component)
        .Map(cfg => cfg.MapKey("OrganizationID"));
    

    在实体上添加 FK 类型的属性与使用字符串映射没有任何区别,我认为也是错误的,因为在我的域对象上暴露了无用的 ID

    【讨论】:

      【解决方案2】:

      如果您将 FK 定义为 EF 类中的属性之一,则足够聪明地为您映射它。您需要遵循使用属性名称的约定并将“Id”附加到它的末尾。

      public class Component
      { 
          public Person Person {get; set;} 
          public int PersonId {get;set;}
          public Group Group { get; set; } 
          public int GroupId {get;set;}
      }
      
      public class Person{ 
          public Component Component { get; set; } 
          public int ComponentId {get;set;}
      }
      
      public class Group
      { 
          public Component Component { get; set; } 
          public int ComponentId {get;set;}
      }
      

      您是否有理由手动进行映射而不是使用迁移?

      【讨论】:

      • 是的,我只是将 FK 作为属性公开很丑陋,因为在 Nhibernate 中你不会这样做,但如果这是 EF 中的方式,我会适应它谢谢
      • 你不需要这样做,但如果你这样做,它会自动为你做一些事情。我有时使用的另一件好事是,如果我有 Id,我可以设置 FK 而不是整个对象。如果您经常序列化实体,这真的很方便。
      • 我会尝试这个,因为数据库是 100% 遗留的,但是使用 OData 我可以从结果中隐藏这些 FK
      • 在实体上添加 FK 类型的属性与使用字符串映射没有任何区别,我认为也是错误的,因为在我的域对象上暴露了无用的 ID
      • 将 FK 作为属性远非无用,我经常使用 FK 而不是实际对象。有时我有 FK,但没有对象,如果您没有将 FK 作为属性公开,即使您只想创建关系,也必须创建对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多