【问题标题】:How to separate large table into multiple discrete types using EF-Code-First如何使用 EF-Code-First 将大表分成多个离散类型
【发布时间】:2012-01-19 11:14:25
【问题描述】:

我正在尝试将一个大表分成多个离散类型。

我在这里按照示例进行操作: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");
}

【问题讨论】:

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


    【解决方案1】:

    编辑:首先在代码中将表拆分为两个以上的实体是非常有问题的。使用 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");
    }
    

    我什至不确定这将如何在真实场景中发挥作用。使用的时候还可以发现一些其他的问题。

    【讨论】:

    • 你是对的!但是,这是个大问题。我认为应该支持以某种方式拆分表,而无需让每个实体跟踪所有其他实体。
    【解决方案2】:

    我发现可行的方法是创建一个视图并将您的其他实体指向该视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多