2015-03-07 3 views
3

У меня есть кусок кода, где я обновляя запись в моей базе данных, копирование, что объект с помощью ValueInjector, а затем пытается добавить, что новый объект в свою базу данных с помощью 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 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, но по какой-то причине, когда я сохранить свои изменения в базу данных обе запись имеет значение 2 для ToLanguage.

Есть ли у кого-нибудь идеи, почему это происходит и как я могу получить правильное значение для ToLanguage?

UPDATE:

Я обнаружил, что если отключить отложенной загрузки для моего контекста данных, используя строку ниже:

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; } 
} 
+0

Извините, у вас было немного времени ... странно ... мои глаза просто пропустили его полностью ... Сравните GUID обоих объектов, они одинаковы, если они есть? –

+0

Нет единого идентификатора GUID между обоими объектами. –

+1

Можете ли вы добавить определение для сущности файла? Я подозреваю, что у вас есть и целое число ForeignKey (ToLanguage), которое является типом значения и свойством, относящимся к языковой сущности. –

ответ

0

@ -Н имеет причину, если ленивая загрузка включена, метод InjectFrom следует скопировать все свойства source файла, даже навигационные свойства. Таким образом, когда вы изменяете значение свойства FK в файле copy, EF игнорирует это значение и сохраняет изменения, основанные на свойстве навигации Language, которое вы уже установили ранее. Я думаю, что порядок транзакций важен здесь, сначала EF должен обновить строку FK ToLanguage в таблице File, связанной с файлом source, и после этого он должен вставить файл copy.

Если вы отключаете ленивую загрузку, ваши свойства навигации не загружаются, и они не обновляются в файле copy, это так, когда вы устанавливаете свойство FK ToLanguage, связь сохраняется так, как вы хотите.

Если вы хотите работать с ленивой загрузкой, я предлагаю вам установить в null, что навигационное свойство (Language) перед сохранением изменений.

Смежные вопросы