C# 实体框架插入错误的数据?
我有一段代码,其中我正在更新数据库中的记录,使用复制该对象,然后尝试使用Entity framework将该新对象添加到我的数据库中:C# 实体框架插入错误的数据?,c#,.net,entity-framework,C#,.net,Entity Framework,我有一段代码,其中我正在更新数据库中的记录,使用复制该对象,然后尝试使用Entity framework将该新对象添加到我的数据库中: //Get record to update File currentFile = db.Files.First(t => t.FileId == updatedFile.FileId && t.CustomerId == PrimaryUser); currentFile.ToLanguage = 2; //update that rec
//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.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; }
}
公共部分类文件
{
公共文件()
{
this.FileServices=new HashSet();
this.FileAudioVariables=new HashSet();
this.FileLanguages=new HashSet();
}
public System.Guid FileId{get;set;}
public System.Guid CustomerId{get;set;}
公共可为空的TemplateId{get;set;}
公共可为空的OrderId{get;set;}
公共字符串文件名{get;set;}
公共bool IsMailInFile{get;set;}
公共字符串FileUrl{get;set;}
公共可空NumberOfSpeakers{get;set;}
公共int AudioLength{get;set;}
public int BillableMinutes{get;set;}
公共可为空的StatusId{get;set;}
公共字符串注释{get;set;}
公共字符串VirtualType{get;set;}
public System.DateTime CreateDate{get;set;}
public System.DateTime上载日期{get;set;}
公共布尔跟踪{get;set;}
公共布尔导出{get;set;}
公共可空IsConverting{get;set;}
公共可空IsInfected{get;set;}
公共可为空的OrderDate{get;set;}
公共可为空的起始日期{get;set;}
公共可为空的DueDate{get;set;}
公共可为空的TranscriptionistId{get;set;}
公共字符串转录子注释{get;set;}
public int-BillingStatusId{get;set;}
公共可为空的ProjectId{get;set;}
公共可为空的专用{get;set;}
可为空的公共ID{get;set;}
可从语言{get;set;}为空的公共
公共可空ToLanguage{get;set;}
公共可为空的ParentFileId{get;set;}
公共虚拟ICollection文件服务{get;set;}
公共虚拟ICollection文件AudioVariables{get;set;}
公共虚拟服务周转服务周转{get;set;}
公共虚拟项目{get;set;}
公共虚拟ICollection文件语言{get;set;}
公共虚拟语言{get;set;}
公共虚拟语言1{get;set;}
}
@a-h有理由,如果启用了延迟加载,那么InjectFrom
方法应该复制源文件的所有属性,甚至是导航属性。这样,当您在copy
文件中更改ToLanguage
FK属性值时,EF将忽略该值,并基于您之前已设置的Language
导航属性保存更改。
我认为事务的顺序在这里很重要,首先EF应该更新文件
表中与源
文件相关的ToLanguage
FK行,然后插入复制
文件
如果禁用延迟加载,则不会加载导航属性,也不会在copy
文件中更新导航属性,这样,当设置ToLanguage
FK属性时,关系会按需要保存
如果您想使用延迟加载,我建议您在保存更改之前在null
中设置导航属性(Language
)。。。。奇怪的我的眼睛完全忽略了它。。。比较两个对象的GUID是否相同?否两个对象之间的GUID是唯一的。是否可以添加文件实体的定义?我怀疑您既有一个值类型的ForeignKey integer(ToLanguage),也有一个与语言实体相关的属性。