Asp.net mvc 3 如何首先使用EF代码将大型表拆分为多个离散类型

Asp.net mvc 3 如何首先使用EF代码将大型表拆分为多个离散类型,asp.net-mvc-3,entity-framework-4.1,ef-code-first,Asp.net Mvc 3,Entity Framework 4.1,Ef Code First,我试图将一个大表分为多个离散类型 我在这里举一个例子: 它适用于主类型和子类型,但在使用多个类型时不起作用。我收到一个错误 实体类型“CampaginFeedback”和“CampaignSurvey”无法共享表“Campaign”,因为它们不在同一类型层次结构中 或者与没有有效的一对一外键关系 在它们之间匹配主键 以下是我的课程的简化版本: 公开课活动{ [关键] 公共ID{get;set;} 公共字符串名称{get;set;} 公共虚拟活动调查{get;set;} 公共虚拟活动反馈{get;

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

我在这里举一个例子:

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

实体类型“CampaginFeedback”和“CampaignSurvey”无法共享表“Campaign”,因为它们不在同一类型层次结构中 或者与没有有效的一对一外键关系 在它们之间匹配主键

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

公开课活动{
[关键]
公共ID{get;set;}
公共字符串名称{get;set;}
公共虚拟活动调查{get;set;}
公共虚拟活动反馈{get;set;}
}
公众阶级运动调查{
[关键]
公共ID{get;set;}
公共字符串问题{get;set;}
公共字符串答案{get;set;}
}
公开课活动反馈{
[关键]
公共ID{get;set;}
公共字符串反馈{get;set;}
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder){
modelBuilder.Conventions.Remove();
modelBuilder.Entity().HasRequired(c=>c.Survey).WithRequiredPrincipal();
modelBuilder.Entity().HasRequired(c=>c.Feedback).WithRequiredPrincipal();
modelBuilder.Entity().ToTable(“活动”);
modelBuilder.Entity().ToTable(“活动”);
modelBuilder.Entity().ToTable(“活动”);
}

编辑:首先在代码中将表拆分为两个以上的实体是非常有问题的。使用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");
}
公开课活动{
[关键]
公共ID{get;set;}
公共字符串名称{get;set;}
公共虚拟活动调查{get;set;}
公共虚拟活动反馈{get;set;}
}
公众阶级运动调查{
[关键]
公共ID{get;set;}
公共字符串问题{get;set;}
公共字符串答案{get;set;}
公共虚拟活动反馈{get;set;}
}
公开课活动反馈{
[关键]
公共ID{get;set;}
公共字符串反馈{get;set;}
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder){
modelBuilder.Conventions.Remove();
modelBuilder.Entity().HasRequired(c=>c.Survey).WithRequiredPrincipal();
modelBuilder.Entity().HasRequired(c=>c.Feedback).WithRequiredPrincipal();
modelBuilder.Entity().HasRequired(c=>c.Feedback).WithRequiredPrincipal();
modelBuilder.Entity().ToTable(“活动”);
modelBuilder.Entity().ToTable(“活动”);
modelBuilder.Entity().ToTable(“活动”);
}

我甚至不确定这在真实场景中会如何工作。使用它时,您会发现一些其他问题

我发现有效的方法是创建一个视图,并将其他实体指向该视图。

你说得对!但是,这真是个大麻烦。我认为应该支持以某种方式拆分表,而不必让每个实体跟踪所有其他实体。