【发布时间】:2015-02-15 13:26:43
【问题描述】:
我需要复制一个 Transport 实体(包括子实体,但其中一个除外:Documents which of type 'Mail')。
这是我的模型:
public class Transport
{
[Key]
public int Id { get; set; }
public string TransportNumber { get; set; }
...
public virtual List<Document> Documents { get; set; }
}
public class Document
{
[Key]
public int Id { get; set; }
public EnumDocumentType Type { get; set; }
public int FileId { get; set; }
public virtual File File { get; set; }
public virtual Transport Transport { get; set; }
}
public class File
{
[Key]
public int Id { get; set; }
public string Filename { get; set; }
public byte[] FileStream { get; set; }
}
我用于复制的 c# 代码:
public void DuplicateTransports(IEnumerable<int> ids) {
var transportsToDuplicate = Context.Transports.Where(t => ids.Contains(t.Id))
.Include(c => c.Documents).ToList();
transportsToDuplicate.ForEach(t =>
{
var newTransport = Context.Transports.Add(t);
newTransport.Id = -100;
AttributeNumber(newTransport);
t.Documents.ForEach(doc =>
{
ObjectContext.LoadProperty(doc, x => x.File);
Context.Documents.Add(doc);
Context.Files.Add(doc.File);
});
Context.SaveChanges();
// (step 2) Don't duplicate child Documents of type Mail
var docs = Context.Documents.Where(doc => doc.TransportId == newTransport.Id && doc.Type == EnumDocumentType.Mail).ToList();
for (int i=docs.Count-1; i>=0; i--) Context.Documents.Remove(docs[i]);
Context.SaveChanges();
});
它按预期工作,但正如您在代码中看到的那样,我必须分两步进行:
- 第 1 步:复制元素 + 在上下文中保存更改
- 第 2 步:搜索 Mail 类型的文档并将其删除 + 在上下文中保存更改
我的问题:是否可以只进行 1 步?因此,请避免添加 Mail 类型的上下文文档,因为在我的情况下,我需要在下一步删除它,我发现它没有优化。
谢谢。
编辑
按照 Philip Stuyckx 的建议,我已经尝试像这样进行 1 步:
transportsToDuplicate.ForEach(t =>
{
var newTransport = Context.Transports.Add(t);
newTransport.Id = -100;
AttributeNumber(newTransport);
t.Documents.ForEach(doc =>
{
if (doc.Type != EnumDocumentType.Mail)
{
ObjectContext.LoadProperty(doc, x => x.File);
Context.Documents.Add(doc);
Context.Files.Add(doc.File);
}
});
Context.SaveChanges();
});
然后出现异常:对数据库的更改已成功提交,但在更新对象上下文时出错。 ObjectContext 可能处于不一致的状态。内部异常消息:发生引用完整性约束冲突:关系一端的“Transport.Id”的属性值与另一端的“Document.TransportId”的属性值不匹配。
【问题讨论】:
标签: c# entity-framework