我有一段代码用于更新数据库中的记录,使用ValueInjector复制该对象,然后尝试使用Entity框架将该新对象添加到我的数据库中:
//Get record to update
File currentFile = db.Files.First(t => t.FileId == updatedFile.FileId && t.CustomerId == PrimaryUser);
currentFile.ToLanguage = 2; //update that record
File copy = Helpers.CopyFile(currentFile); //copy the currentFile
copy.FileId = Guid.NewGuid();
copy.ToLanguage = 3;
copy.Project = null;
db.Files.Add(copy); //add new record to the database
db.SaveChanges();
CopyFile的定义:
public static VerbalInk.Data.File CopyFile(Data.File source)
{
Data.File newFile = new Data.File();
newFile.InjectFrom(source);
return newFile;
}
当我在db.Files.Add(copy);
行放置一个断点,然后查看copy.ToLanguage
时,它的预期值为3
,但出于某种原因,当我将更改保存到数据库时,两个记录ToLanguage
的值为2。
有没有人知道为什么会发生这种情况以及如何为ToLanguage
插入正确的值?
更新
我发现如果我使用以下行禁用Lazy Loading作为我的数据上下文:
db.Configuration.LazyLoadingEnabled = false;
然后一切都按预期更新。有人能解释为什么会这样吗?有没有办法让我的代码能够在不禁用延迟加载的情况下运行?
File
定义:
public partial class File
{
public File()
{
this.FileServices = new HashSet<FileService>();
this.FileAudioVariables = new HashSet<FileAudioVariable>();
this.FileLanguages = new HashSet<FileLanguage>();
}
public System.Guid FileId { get; set; }
public System.Guid CustomerId { get; set; }
public Nullable<System.Guid> TemplateId { get; set; }
public Nullable<System.Guid> OrderId { get; set; }
public string FileName { get; set; }
public bool IsMailInFile { get; set; }
public string FileUrl { get; set; }
public Nullable<int> NumberOfSpeakers { get; set; }
public int AudioLength { get; set; }
public int BillableMinutes { get; set; }
public Nullable<int> StatusId { get; set; }
public string Notes { get; set; }
public string VirtualType { get; set; }
public System.DateTime CreateDate { get; set; }
public System.DateTime UploadDate { get; set; }
public bool Tracked { get; set; }
public bool Exported { get; set; }
public Nullable<bool> IsConverting { get; set; }
public Nullable<bool> IsInfected { get; set; }
public Nullable<System.DateTime> OrderDate { get; set; }
public Nullable<System.DateTime> StartDate { get; set; }
public Nullable<System.DateTime> DueDate { get; set; }
public Nullable<System.Guid> TranscriptionistId { get; set; }
public string TranscriptionistNotes { get; set; }
public int BillingStatusId { get; set; }
public Nullable<System.Guid> ProjectId { get; set; }
public Nullable<bool> Specialized { get; set; }
public Nullable<int> TurnaroundId { get; set; }
public Nullable<int> FromLanguage { get; set; }
public Nullable<int> ToLanguage { get; set; }
public Nullable<System.Guid> ParentFileId { get; set; }
public virtual ICollection<FileService> FileServices { get; set; }
public virtual ICollection<FileAudioVariable> FileAudioVariables { get; set; }
public virtual ServiceTurnaround ServiceTurnaround { get; set; }
public virtual Project Project { get; set; }
public virtual ICollection<FileLanguage> FileLanguages { get; set; }
public virtual Language Language { get; set; }
public virtual Language Language1 { get; set; }
}
答案 0 :(得分:0)
@ a-h有理由,如果启用了延迟加载,InjectFrom
方法应该复制source
文件的所有属性,甚至是导航属性。这样,当您更改ToLanguage
文件中的copy
FK属性值时,EF会忽略该值并根据之前已设置的Language
导航属性保存更改。
我认为事务的顺序在这里很重要,首先EF应该更新与ToLanguage
文件相关的File
表中的source
FK行,之后,它应该插入{{ 1}}文件。
如果您停用延迟加载,则导航属性不会被加载,并且在copy
文件中不会更新它们,当您设置copy
FK属性时,这种关系可以随心所欲地保存。
如果您想使用延迟加载,我建议您在保存更改之前在ToLanguage
中设置导航属性(null
)。