У меня есть объект, который включает свойство CreatedByUserID в виде целого числа, допускающего обнуляемое значение, которое затем ссылается на таблицу Users, а свойство CreatedByUser в объекте указывает на этого пользователя. Когда я инициализирую CreatedByUserID (или ссылку CreatedByUser) и затем добавляю объект в DbSet Payments, значения устанавливаются правильно. Однако, если я касаюсь трекера изменений или проверяю, есть ли у него HasChanges, только это свойство и связанная с ним ссылка устанавливаются в нуль. Я преобразовал свойство CreatedByUserID в пару get / set и установил там точку останова. Это подтвердило, что Entity Framework вызывает набор свойств или сбрасывает свойства из трассировки стека ниже. Две нижние записи - это мой код, как и строка вверху. Вы можете видеть, что он отслеживает изменения и обнуляет параметр CreatedByUserID. Я попытался установить ссылку CreatedByUser, а также идентификатор, но ни один из них не имеет значения.
Почему обнаруженные изменения должны изменить значения в моей сущности? Разве это не просто смотреть на изменения? Как заставить это остановить это поведение?
DataModels.dll! Armada.DataModels.Payment.set_CreatedByUserID (целое число? Значение) Строка 68 Базовая [облегченная функция]
EntityFramework.dll! Система .Data.Entity.Core.Objects.DelegateFactory.SetValue (свойство System.Data.Entity.Core.Metadata.Edm.EdmProperty, цель объекта, значение объекта) + 0x3 c байт
EntityFramework.dll! System.Data .Entity.Core.Objects.StateManagerMemberMetadata.SetValue (объект userObject, значение объекта) + 0xa0 байт
EntityFramework.dll! System.Data.Entity.Core.Objects.Internal.SnapshotChangeTrackingStrategy.SueityurataCore Запись .Objects.EntityEntry, член System.Data.Entity.Core.Objects.StateManagerMemberMetadata, порядковый номер объекта, цель объекта, значение объекта) + 0x7 c байт
EntityFramework.dll! System.Data.Entity.Core.Objects .Internal.EntityWrapper.SetCurrentValue (запись System.Data.Entity.Core.Objects.EntityEntry, System.Data.Entity.Core.Objects.StateManagerMemberMetadata член, внутренний порядковый номер, цель объекта, значение объекта) + 0x40 байт EntityFramework.dll! System.Data.Entity.Core.Objects.DataClasses.EntityReference.NullAllForeignKeys () + 0x5fd байт
EntityFramework.dll! System.Data.Entity .Core.Objects.DataClasses.EntityReference.RemoveFromLocalCache (System.Data.Entity.Core.Objects.Internal.IEntityWrapper wrappedEntity, bool resetIsLoaded, bool preserveForeignKey) + 0x8e байт
EntityFramework.dll! Objects.DataClasses.RelatedEnd.RemoveFromCache (System.Data.Entity.Core.Objects.Internal.IEntityWrapper wrappedEntity, bool resetIsLoaded, bool preserveForeignKey) + 0x32 байта EntityFramework.dll! System.Data.Entity.Core.Oject. Remove (System.Data.Entity.Core.Objects.Internal.IEntityWrapper wrappedEntity, bool doFixup, bool deleteEntity, bool deleteOwner, bool applyReferentialConstraints, bool preserveForeignKey) + 0x170 байт
EntityFrameworkEnt.dll. System.Cata.Cata. Objects.DataClasses.RelatedEnd.F ixupOtherEndOfRelationshipForRemove (System.Data.Entity.Core.Objects.Internal.IEntityWrapper wrappedEntity, bool preserveForeignKey) + 0x53 байта
EntityFramework.dll! System.Data.Entity.Core.Objects.DataDemove. Entity.Core.Objects.Internal.IEntityWrapper wrappedEntity, bool doFixup, bool deleteEntity, bool deleteOwner, bool applyReferentialConstraints, bool preserveForeignKey) + 0x218 байт
EntityFramework.dll! System.Data.Entb. Remove (System.Data.Entity.Core.Objects.Internal.IEntityWrapper wrappedEntity, bool doFixup, bool deleteEntity, bool deleteOwner, bool applyReferentialConstraints, bool preserveForeignKey) + 0x153 байта
EntityFrameworkEnt.Ent.Core.Core.Core.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.Cata.D. Objects.DataClasses.RelatedEnd.Remove (System.Data.Entity.Core.Objects.Internal. IEntityWrapper wrappedEntity, bool preserveForeignKey) + 0x64 байт
EntityFramework.dll! System.Data.Entity.Core.Objects.ObjectStateManager.PerformDelete (System.Collections.Generi c .IList записей) + 0x7f. dll! System.Data.Entity.Core.Objects.ObjectStateManager.AlignChangesInRelationships (System.Collections.Generi c .IList записей) + 0x26 байт
EntityFramework.dll! System.Data.Entity.Core.Objects.ObjectMtate DetectChanges () + 0xc0 байтов EntityFramework.dll! System.Data.Entity.Core.Objects.ObjectContext.DetectChanges () + 0x34 байта
EntityFramework.dll! System.Data.Entity.Internal.InternalContext.DetectChanges) + 0x4e байт
EntityFramework.dll! System.Data.Entity.Infrastructure.DbChangeTracker.HasChanges () + 0x2f байт DataModels.dll! Armada.DataModels.Database.DatabaseHelpers.GetEntityState (System.Data.Entity.DxContet ct DataObject) Строка 82 + 0x19 байт. Basic DataModels.dll! Armada.DataModels.Database.Database. Helpers.CheckModified (System.Data.Entity.DbContext ctx, Object DataObject) Строка 65 + 0x1 c байт Basi c**
Код:
Private Sub PaymentsViewModel_NewEntityRequest(ByRef Entity As PaymentViewModel) Handles Me.NewEntityRequest
Dim pmt As Payment = DBCTX.DatabaseContext.Payments.Create
With pmt
.CompanyID = SelectedCompanyID
.BorrowerID = Nothing
.MortgageID = Nothing
If SelectedBorrowerID.HasValue Then
.Borrower = DBCTX.DatabaseContext.Borrowers.Find(SelectedBorrowerID.Value)
.Mortgage = .Borrower.MortgageApplicants.FirstOrDefault.Mortgage ' get the first one loaded as the default
.MortgageStatus = .Mortgage.MortgageStatus
End If
If SelectedDay.HasValue Then
.PaymentDate = DateSerial(EffectiveDate.Value.Year, EffectiveDate.Value.Month, SelectedDay.Value)
Else
.PaymentDate = EffectiveDate.Value
End If
.PostingStatus = PaymentPostingStatuses.Unposted
.PaymentType = PaymentTypes.Active
.CreatedByUser = CurrentUser
.DateCreated = Now
End With
DBCTX.DatabaseContext.Payments.Add(pmt)
Entity = New PaymentViewModel(Me, pmt, True)
End Sub
Код, который проверяет изменения и запускает «обнуление»: Dim изменяется как IEnumerable (Of DbEntityEntry) = DBCTX.ChangeTracker.Entries (). Где (Function (ee) ee.State = EntityState.Added)
, , , Dim cnt As Integer = MyBase.SaveChanges ()