【发布时间】:2016-12-21 08:27:10
【问题描述】:
我有 2 个实体:Project 和 StepImplementation。 StepImplementation 对 Project 表有一个 FK。
我需要向数据库添加一个包含 500 步的新项目。如果我使用简单的 EntityFramework - 我没有问题,但就我在 SQL Profiler 中有 500 个步骤而言,我观察到 500 个插入。所以我正在尝试使用EntityFramework.BulkInsert 添加一个包含一系列步骤的新项目。
public Project CreateProjectCopy(Project project)
{
var newProject = this.repositoryScope.Projects.Value.Add(new Project()
{
Name = project.Name,
BddFrameworkType = project.BddFrameworkType,
Domain = project.Domain,
IsActive = project.IsActive,
IsPrivate = project.IsPrivate,
ProjectKey = this.GenerateProjectKey(),
SavingMode = project.SavingMode
});
this.repositoryScope.Projects.Value.SaveChanges();
var checkProjectExists = this.repositoryScope.Projects.Value.GetFirstOrDefault(x => x.Id == newProject.Id);
var steps = project.StepImplementations.Select(s => new StepImplementation()
{
DocComment = s.DocComment,
StepImplementationText = s.StepImplementationText,
Project = checkProjectExists
}).ToList();
this.repositoryScope.StepImplementations.Value.AddRange(steps);
this.repositoryScope.StepImplementations.Value.SaveChanges();
newProject.Branches = this.treeManager.CopyAll(project);
return newProject;
}
public virtual void AddRange(List<T> entities)
{
this.context.BulkInsert(entities, new BulkInsertOptions { SqlBulkCopyOptions = SqlBulkCopyOptions.CheckConstraints, BatchSize = entities.Count() });
}
在 AddRange 方法中,我收到一个错误:“INSERT 语句与 FOREIGN KEY 约束冲突
FK_dbo.StepImplementation_dbo.Project_Project_Id"。冲突 发生在数据库“RelimeDB”、表“dbo.Project”、“Id”列中。这 语句已终止。
但我故意添加了 checkProjectExists 变量来检查项目是否存在于数据库中。同样在 addRange 方法之前,我通过 Sql Manager Studio 检查新添加的项目并且它可用。那么为什么 BulkInsert 不能添加步骤,如果纯 EntityFramework 可以呢?
【问题讨论】:
-
你的
StepImplementations类可能有一个“ProjectId”属性,尝试设置它而不是/以及Project属性。我猜BulkInsert不会查看子对象。 -
另外,你真的应该在继续之前检查
checkProjectExists是否为空,或者,如果你知道它会一直存在,使用First或Single而不是FirstOrDefault -
在我的 StepImplementation 类中 Project 是虚拟的:
public virtual Project Project { get; set; }在这种情况下我无法设置 Project_Id,我收到错误消息。
标签: c# sql-server entity-framework bulkinsert