微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc-3 – 如何使用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

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

The Entity types ‘CampaginFeedback’ and ‘CampaignSurvey’ cannot share table ‘Campaign’ because they are not int he same type hierarchy
or do not have a valid one to one foreign key relationship with
matching primary keys between them.

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

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");
}

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐