【问题标题】:How to specify the principal end of a 1-1 relationship in code first mapping如何在代码优先映射中指定 1-1 关系的主体端
【发布时间】:2014-01-15 06:09:37
【问题描述】:

我有一堂课:

public partial class CanteenTerminal : XTimeEntity
{
  public virtual Terminal Terminal { get; set; }
  public short TerminalId { get; set; }
}

及其映射类:

public CanteenTerminalMap()
{
  // Primary Key
  HasKey(t => t.Id);

  // Table & Column Mappings
  ToTable("CANTEENTERM");
  Property(t => t.Id).HasColumnName("TERM_CODEID");

  // Relationships
  HasRequired(t => t.Terminal)
    .WithOptional(t => t.CanteenTerminal);
}

我还有课Terminal:

public partial class Terminal : XTimeEntity
{
  public Terminal()
  {
    ControllerInterfacePointers = new List<ControllerInterfacePointer>();
    TerminalParameters = new List<TerminalParameter>();
  }

  public string Name { get; set; }
  public string Version { get; set; }
  public short Enabled { get; set; }
  public virtual CanteenTerminal CanteenTerminal { get; set; }
  public short CanteenTerminalId { get; set; }
  public virtual ICollection<ControllerInterfacePointer> ControllerInterfacePointers { get; set; }
  public virtual ICollection<TerminalParameter> TerminalParameters { get; set; }
}

及其映射文件:

public TerminalMap()
{
  // Primary Key
  HasKey(t => t.Id);

  Property(t => t.Name)
      .IsRequired()
      .HasMaxLength(30);
  Property(t => t.Version)
      .HasMaxLength(8);

  // Table & Column Mappings
  ToTable("TERMINAL");
  Property(t => t.Id).HasColumnName("TERM_CODEID");
  Property(t => t.Name).HasColumnName("TERM_NAME");
  Property(t => t.Version).HasColumnName("TERM_VERSION");
  Property(t => t.Enabled).HasColumnName("TERM_ENABLED");
  Ignore(t => t.MasterId);
  Ignore(t => t.IsActive);

  HasOptional(t => t.CanteenTerminal)
    .WithRequired(t => t.Terminal);
}

每当构建数据模型时,即当我运行测试查询时,我都会收到以下错误。我从几个一对一的关系中得到了这个,我只是暂时从实体中删除了这些属性,以避免来自我还不感兴趣的实体的错误。

无法确定之间关联的主体端 类型“XTime.Data.CanteenTerminal”和“XTime.Data.Terminal”。这 此关联的主体端必须使用显式配置 关系流式 API 或数据注释。

我该如何指定关系的主体端?

【问题讨论】:

  • 在 "withrequired(t => t.Terminal)" .withkey(--specify key here--).. 对不起,我没有在 atm 上测试它的工具,但我相信我这样解决了这个问题..
  • 流畅链中WithRequired()后面没有WithKey选项。
  • 您使用的是哪个版本的 EF?这个link 可能有用,但我怀疑它是否适用于所有版本的 EF。如果不支持,您将寻找类似 @​​987654329@ 的内容。

标签: c# entity-framework ef-code-first entity-framework-6


【解决方案1】:

这里有一个这类问题的好例子: http://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired

这里的主键映射为:

modelBuilder.Entity<OfficeAssignment>()
    .HasKey(t => t.InstructorID);

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

我确实必须在示例中添加一个额外的导航属性(在讲师课程中),它似乎工作正常:

// Navigation property 
public virtual OfficeAssignment OfficeAssignment { get; set; }

【讨论】:

    【解决方案2】:

    作为测试,我会建议一些疯狂的东西:

    public partial class Terminal : XTimeEntity
    {
      public Terminal()
      {
        ControllerInterfacePointers = new List<ControllerInterfacePointer>();
        TerminalParameters = new List<TerminalParameter>();
      }
    
      public string Name { get; set; }
      public string Version { get; set; }
      public short Enabled { get; set; }
      [Required] //I think this line will trick EF into liking you.
      public virtual CanteenTerminal CanteenTerminal { get; set; }
      public short CanteenTerminalId { get; set; }
      public virtual ICollection<ControllerInterfacePointer> ControllerInterfacePointers { get; set; }
      public virtual ICollection<TerminalParameter> TerminalParameters { get; set; }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多