实体框架插入错误的数据

本文关键字:数据 错误 插入 框架 实体 | 更新日期: 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表中的ToLanguageFK行,然后插入copy文件。

如果禁用延迟加载,则导航属性不会加载,也不会在copy文件中更新,也就是说,当设置ToLanguage FK属性时,关系会根据需要保存。

如果您想使用延迟加载,我建议您在保存更改之前在null中设置导航属性(Language)。