首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用EF-Code-First将大型表划分为多个离散类型

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

Stack Overflow用户
提问于 2011-12-13 15:20:11
回答 2查看 3.6K关注 0票数 4

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

下面是我的例子: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’不能共享表‘活动’,因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,并且在它们之间匹配主键。

下面是我的类的简化版本:

代码语言:javascript
复制
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");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-13 18:01:04

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

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

因此,您的示例的解决方案应该如下:

代码语言:javascript
复制
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");
}

我甚至不确定这在实际情况下会如何运作。您可以在使用它时发现其他一些问题。

票数 4
EN

Stack Overflow用户

发布于 2013-06-06 15:54:21

我发现一些有用的东西就是创建一个视图,并将你的其他实体指向这个视图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8491619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档