实体框架插入错误的数据
本文关键字:数据 错误 插入 框架 实体 | 更新日期: 2024-10-21 05:10:22
我有一段代码,我正在更新数据库中的一条记录,使用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
的正确值吗?
更新:
我发现,如果我使用以下行禁用数据上下文的懒惰加载:
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; }
}
@a-h有原因,如果启用了延迟加载,InjectFrom
方法应该复制source
文件的所有属性,甚至是导航属性。这样,当您在copy
文件中更改ToLanguage
FK特性值时,EF会忽略该值,并根据您之前已经设置的Language
导航特性保存更改。我认为事务的顺序在这里很重要,首先EF应该更新与source
文件相关的File
表中的ToLanguage
FK行,然后插入copy
文件。
如果禁用延迟加载,则导航属性不会加载,也不会在copy
文件中更新,也就是说,当设置ToLanguage
FK属性时,关系会根据需要保存。
如果您想使用延迟加载,我建议您在保存更改之前在null
中设置导航属性(Language
)。