如何使用EF-Code-First将大表分成多个离散类型

时间:2011-12-13 15:20:12

标签: asp.net-mvc-3 entity-framework-4.1 ef-code-first

我试图将一个大表分成多个离散类型。

我在这里关注这个例子:http://weblogs.asp.net/manavi/archive/2011/04/24/associations-in-ef-4-1-code-first-part-4-table-splitting.aspx?CommentPosted=true#commentmessage

它适用于主要类型和子类型,但在使用多种类型时不起作用。我收到了错误

  

实体类型'CampaginFeedback'和'CampaignSurvey'不能共享表'Campaign',因为它们不属于同一类型层次结构   或者没有有效的一对一外键关系   匹配它们之间的主键。

以下是我的课程的简化版本:

public class Campaign {
  [Key]
  public int CampaignId {get;set;}
  public string Name {get;set;}
  public virtual CampaignSurvey Survey {get;set;}
  public virtual CampaignFeedback Feedback {get;set;}
}

public class CampaignSurvey {
  [Key]
  public int CampaignId {get;set;}
  public string Question {get;set;}
  public string Answer {get;set;}
}

public class CampaignFeedback {
  [Key]
  public int CampaignId {get;set;}
  public string Feedback {get;set;}
}

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Campaign>().HasRequired(c => c.Survey).WithRequiredPrincipal();
    modelBuilder.Entity<Campaign>().HasRequired(c => c.Feedback).WithRequiredPrincipal();
    modelBuilder.Entity<Campaign>().ToTable("Campaign");
    modelBuilder.Entity<CampaignSurvey>().ToTable("Campaign");
    modelBuilder.Entity<CampaignFeedback>().ToTable("Campaign");
}

2 个答案:

答案 0 :(得分:4)

编辑:首先在代码中将表拆分为两个以上的实体是非常有问题的。使用EDMX时它没有任何问题。

要使其工作,您必须确保用于拆分表的每个实体与用于拆分表的所有其他实体具有有效的一对一关系。这也意味着使用导航属性破坏您的模型,并且确保在保存期间指向相同实体类型的所有导航属性引用相同的实例(否则您将在调用SaveChanges期间获得异常)。

所以你的例子的解决方案应该是这样的:

public class Campaign {
  [Key]
  public int CampaignId {get;set;}
  public string Name {get;set;}
  public virtual CampaignSurvey Survey {get;set;}
  public virtual CampaignFeedback Feedback {get;set;}
}

public class CampaignSurvey {
  [Key]
  public int CampaignId {get;set;}
  public string Question {get;set;}
  public string Answer {get;set;}

  public virtual CampaignFeedback Feedback {get;set;}
}

public class CampaignFeedback {
  [Key]
  public int CampaignId {get;set;}
  public string Feedback {get;set;}
}

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<Campaign>().HasRequired(c => c.Survey).WithRequiredPrincipal();
    modelBuilder.Entity<Campaign>().HasRequired(c => c.Feedback).WithRequiredPrincipal();
    modelBuilder.Entity<CampaignSurvey>().HasRequired(c => c.Feedback).WithRequiredPrincipal();

    modelBuilder.Entity<Campaign>().ToTable("Campaign");
    modelBuilder.Entity<CampaignSurvey>().ToTable("Campaign");
    modelBuilder.Entity<CampaignFeedback>().ToTable("Campaign");
}

我甚至不确定这在真实场景中是如何工作的。使用它时,您可以找到一些其他问题。

答案 1 :(得分:0)

我发现的一些功能是创建一个视图并将其他实体指向该视图。