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

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

我有一段代码,其中我正在更新数据库中的记录,使用复制该对象,然后尝试使用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.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),也有一个与语言实体相关的属性。