【发布时间】:2021-06-22 21:43:28
【问题描述】:
我有以下具有以下结构的实体项目天气
public class ProjectWeather
{
[Key, ForeignKey("Project")]
public string ProjectNumber { get; set; }
[GraphQLIgnore]
public virtual Project Project { get; set; }
[ForeignKey("WeatherStation")]
public string WeatherStationNumber { get; set; }
}
我还有其他实体project,结构如下所示
public class Project : PatchEntityProperties
{
[Key, GraphQLNonNullType]
public string ProjectNumber { get; set; }
public string Name { get; set; }
public bool IsLocked { get; set; }
public ProjectWeather Weather { get; set; } = new ();
}
我正在尝试使用以下代码将一个项目信息复制到另一个项目中
var cloneOfSourceProject = dbContext.Projects
.AsNoTracking()
.Where(a => a.ProjectNumber == sourceProjectNumber)
.SingleOrDefault();
// Tracked so we can remove existing project before adding copied entity
var targetProject = dbContext.Projects
.Where(a => a.ProjectNumber == targetProjectNumber)
.SingleOrDefault();
if (cloneOfSourceProject == default)
{
throw new ArgumentException($"The project with project number '{sourceProjectNumber}' does not exist; an invalid project cannot be copied.");
}
string targetProjectName;
if (targetProject == default)
{
targetProjectName = dbContext.Projects.AsNoTracking().Where(a => a.Number == targetProjectNumber).SingleOrDefault()?.Name ?? "";
}
else
{
targetProjectName = targetProject.Name;
dbContext.Remove(targetProject);
}
cloneOfSourceProject.ProjectNumber = targetProjectNumber;
cloneOfSourceProject.Name = targetProjectName;
dbContext.Add(cloneOfSourceProject);
dbContext.SaveChanges();
但是在重复键值上出现错误违反了对项目天气的 PK_projectweather 的唯一约束,我不确定如何克服该错误,上面的代码有什么问题吗?我正在使用 EFcore 和 postgresql。
谁能告诉我这方面的任何想法,非常感谢。
【问题讨论】:
-
您正在创建与源项目具有相同 ID 的“cloneOfSourceProject”,而不删除源项目。删除源项目、更改 ID 或将克隆创建为新对象,然后简单地将源项目中的字段复制到其中。
-
抱歉措辞,没有源代码的克隆,我实际上只使用 sourceProjectNumber 获取源项目
-
你是对的,对不起,我错过了 ProjectNumber 是 ID 并且你正在更改它的事实。也许尝试创建一个新对象而不是保存作为查询结果的对象?
-
您应该在帖子中添加原始错误消息。只是好奇,你为什么要在
if (targetProject == default)中第二次查询目标项目? -
@atiyar 原消息是这个
duplicate key value violates unique constraint on PK_projectweather on project weather
标签: .net postgresql entity-framework-core npgsql