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

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

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....