gpt4 book ai didi

c# - Entity Framework 插入错误的数据?

转载 作者:行者123 更新时间:2023-11-30 18:26:17 24 4
gpt4 key购买 nike

我有一段代码,我正在更新数据库中的记录,使用 ValueInjector 复制该对象然后尝试使用 Entity Framework 将该新对象添加到我的数据库中:

//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;

然后一切都按预期更新。有人可以解释为什么会这样吗?有没有一种方法可以让我的代码在不禁用延迟加载的情况下工作?

文件定义:

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 导航的更改您之前已经拥有的属性(property)。我认为事务的顺序在这里很重要,首先 EF 应该更新 File 表中与 source 文件相关的 ToLanguage FK 行,并且之后,它应该插入 copy 文件。

如果您禁用延迟加载,则不会加载您的导航属性,并且它们不会在 copy 文件中更新,这就是您设置 ToLanguage FK 属性时的方式,关系随心所欲地保存。

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

关于c# - Entity Framework 插入错误的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com