In EF4 db에서 엔티티를로드하고 해당 특성을 이전과 동일한 값으로 설정하면 여전히 db에 대해 갱신 사항이 발행됩니다.변경 추적 동작이 EF6과 EF4 사이에서 변경되었습니다. Ef4 동작으로 되돌리려면 어떻게해야합니까?
EF6에서 엔티티는 속성 값이 변경되지 않았으므로 DB에 업데이트가 실행되지 않는다는 것을 알고있는 것처럼 보입니다.
EF6에서 EF4 동작을 얻을 수 있습니까? 내가 시도 무엇
:
- 설정 "context.Configuration.AutoDetectChangesEnabled = 거짓;". 이것은 작동하지 않았다.
- 우박 메리 : context.Configuration.ValidateOnSaveEnabled = false; 이것은 또한 작동하지 않았다.
- ((IObjectContextAdapter) 컨텍스트) .ObjectContext.ContextOptions.UseLegacyPreserveChangesBehavior = true;
나는 약간의 트리거에 의존하는 데 사용되는 코드 (ModifiedDate)을 필드를 업데이트하고 이전에 EF4 항상 저장하고 지금 EF6 나던 야기하고 이것이 원인이 있기 때문에 이전 EF4 행동이 필요한 이유를 작동하지 않았다 주요 회귀 머리 아파!
내가 이것을 테스트하는 데 사용되는 일부 코드 :
내가 새로운 값으로 ModifiedDate 열을 변경하고 그에 EF가 발생합니다 근무하고 무엇
public void UpdateScenarioWithNoChangesCausesEfToNotPersistChanges() { using ( TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted })) { using (EnterpriseModel context = new EnterpriseModel()) { //context.Configuration.AutoDetectChangesEnabled = false; //did not work //context.Configuration.ValidateOnSaveEnabled = false; //did not work //((IObjectContextAdapter) context).ObjectContext.ContextOptions.UseLegacyPreserveChangesBehavior = true; //did not work Guid id = new Guid("3321dbaf-c55e-e411-80cf-00155d0d70c0"); var efScenario = (from s in context.Scenario where s.ScenarioId == id select s).First(); DateTime modifiedDateBeforeChanges = efScenario.ModifiedDate; //just setting the value back to itself. efScenario.ModifiedBy = efScenario.ModifiedBy; context.SaveChanges(); //ef scenario object's ModifiedDate is set as a Computed DateTime modifiedDateAfterChanges = efScenario.ModifiedDate; //There is a trigger on Updates that sets the modifiedDate in the database. //also ModifiedDate is set as a computed column. //the following passes for EF4 and fails for EF6. //If in EF6 i do make a change to efScenario.ModifiedBy = efScenario.ModifiedBy; //then EF6 works! Assert.AreNotEqual(modifiedDateBeforeChanges, modifiedDateAfterChanges); } } }
변경 사항을 감지하고 저장합니다. 트리거는 수정 된 날짜를 업데이트 한 다음 열이 계산 된 것으로 표시되기 때문에 EF는 값을 검색합니다. (DONT LIKE! 내가 SaveChanges를 호출 모든 방법을 통해 이동하고 새로운 ModifiedDate 값으로 업데이트되고 이전에 업데이 트하는 데 사용하십시오 모든 개체를해야 할 것이다있다. context.Entry (efScenario를 호출
- ) .STATE = EntityState.Modified, 그냥 SaveChanges를 호출하기 전에이 (1), 내 의견으로는 내가 아마 지금 1로 갈 것보다 낫다
내 이상적인 솔루션 :.. . 내가 EF에서 전환 할 수있는 설정은 EF4의 이전 동작을 가져올 수있게 해줍니다.
보너스 질문 : EF에서이 동작은 언제 변경 되었습니까? 나는이 변화에 관한 문서를 찾지 못하는 것 같다!
테이블 구조
CREATE TABLE [dbo].[Scenario](
[ScenarioId] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Scenario_ScenarioId] DEFAULT (newsequentialid()),
[Name] [varchar](200) NOT NULL,
[ModifiedBy] [varchar](100) NOT NULL,
[ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Scenario_ModifiedDate] DEFAULT (getdate()),
CONSTRAINT [PK_Scenario] PRIMARY KEY CLUSTERED
(
[ScenarioId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TRIGGER [dbo].[trUpdateModifiedDateScenario]
ON [dbo].[Scenario]
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE a SET a.[Name]=b.[Name]
, a.[ModifiedBy]=b.[ModifiedBy]
, a.[ModifiedDate]=GETDATE()
FROM [dbo].[Scenario] a
INNER JOIN inserted b
ON a.[ScenarioId]=b.[ScenarioId]
END;
GO
이 변경 사항이 언제 발생했는지 알고 있습니까 (EF5, EF6)? –
아니요 아니요,하지만 그 중 어느 것도 문제를 해결하지 못합니다. –