实体框架插入错误的数据?

时间:2015-03-07 00:33:34

标签: c# .net entity-framework

我有一段代码用于更新数据库中的记录,使用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; }
}

1 个答案:

答案 0 :(得分:0)

@ a-h有理由,如果启用了延迟加载,InjectFrom方法应该复制source文件的所有属性,甚至是导航属性。这样,当您更改ToLanguage文件中的copy FK属性值时,EF会忽略该值并根据之前已设置的Language导航属性保存更改。 我认为事务的顺序在这里很重要,首先EF应该更新与ToLanguage文件相关的File表中的source FK行,之后,它应该插入{{ 1}}文件。

如果您停用延迟加载,则导航属性不会被加载,并且在copy文件中不会更新它们,当您设置copy FK属性时,这种关系可以随心所欲地保存。

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