1- // Copyright (C) 2003-2010 Xtensive LLC.
2- // All rights reserved .
3- // For conditions of distribution and use, see license .
1+ // Copyright (C) 2008-2020 Xtensive LLC.
2+ // This code is distributed under MIT license terms .
3+ // See the License.txt file in the project root for more information .
44// Created by: Dmitri Maximov
55// Created: 2008.11.03
66
77using System ;
8+ using System . Linq ;
89using System . Reflection ;
910using NUnit . Framework ;
1011using Xtensive . Orm . Services ;
@@ -31,6 +32,16 @@ public string Value
3132 }
3233 }
3334
35+ [ Field ]
36+ public MyRefEntity Reference
37+ {
38+ get { return GetFieldValue < MyRefEntity > ( "Reference" ) ; }
39+ set {
40+ throw new InvalidOperationException ( ) ;
41+ // SetFieldValue("Reference", value);
42+ }
43+ }
44+
3445 [ Field ]
3546 public MyEntitySet < MyEntity > Items { get ; private set ; }
3647
@@ -39,7 +50,7 @@ public string Value
3950 protected override void OnInitialize ( )
4051 {
4152 base . OnInitialize ( ) ;
42- throw new InvalidOperationException ( ) ;
53+ // throw new InvalidOperationException();// for being able to query data from database
4354 }
4455
4556 protected override void OnSettingFieldValue ( FieldInfo field , object value )
@@ -172,89 +183,286 @@ public MyEntitySet(Entity owner, FieldInfo field)
172183 {
173184 }
174185 }
186+
187+ [ HierarchyRoot ]
188+ public class MyRefEntity : Entity
189+ {
190+ [ Field , Key ]
191+ public int Id { get ; private set ; }
192+
193+ [ Field ]
194+ public string Value { get ; set ; }
195+ }
175196}
176197
177198namespace Xtensive . Orm . Tests . Storage
178199{
179200 [ TestFixture ]
180201 public class CoreServicesTest : AutoBuildTest
181202 {
182- protected override Xtensive . Orm . Configuration . DomainConfiguration BuildConfiguration ( )
203+ protected override Orm . Configuration . DomainConfiguration BuildConfiguration ( )
183204 {
184205 var config = base . BuildConfiguration ( ) ;
185- config . Types . Register ( Assembly . GetExecutingAssembly ( ) , typeof ( MyEntity ) . Namespace ) ;
206+ config . Types . Register ( typeof ( MyEntity ) . Assembly , typeof ( MyEntity ) . Namespace ) ;
186207 return config ;
187208 }
188209
189210 [ Test ]
190211 public void CreateInstanceTest ( )
191212 {
192- using ( var session = Domain . OpenSession ( ) ) {
193- using ( var t = session . OpenTransaction ( ) ) {
194- var accessor = Session . Current . Services . Get < DirectPersistentAccessor > ( ) ;
195- accessor . CreateEntity ( typeof ( MyEntity ) ) ;
196- accessor . CreateStructure ( typeof ( MyStructure ) ) ;
197- t . Complete ( ) ;
198- }
213+ using ( var session = Domain . OpenSession ( ) )
214+ using ( var t = session . OpenTransaction ( ) ) {
215+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
216+ var entity = accessor . CreateEntity ( typeof ( MyEntity ) ) ;
217+ var structure = accessor . CreateStructure ( typeof ( MyStructure ) ) ;
218+ Assert . That ( entity . PersistenceState , Is . EqualTo ( PersistenceState . New ) ) ;
219+ Assert . That ( structure . Owner , Is . Null ) ;
220+ t . Complete ( ) ;
199221 }
200222 }
201223
202224 [ Test ]
203- public void SetFieldTest ( )
204- {
205- using ( var session = Domain . OpenSession ( ) ) {
206- using ( var t = session . OpenTransaction ( ) ) {
207- var accessor = Session . Current . Services . Get < DirectPersistentAccessor > ( ) ;
208- var myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
209- myEntity . Session . Services . Get < DirectPersistentAccessor > ( ) . SetFieldValue ( myEntity , myEntity . TypeInfo . Fields [ "Value" ] , "Value" ) ;
210- Assert . AreEqual ( "Value" , myEntity . Value ) ;
211- var myStructure = ( MyStructure ) accessor . CreateStructure ( typeof ( MyStructure ) ) ;
212- myStructure . Session . Services . Get < DirectPersistentAccessor > ( ) . SetFieldValue ( myStructure , myStructure . TypeInfo . Fields [ "Value" ] , "Value" ) ;
213- Assert . AreEqual ( "Value" , myStructure . Value ) ;
214- t . Complete ( ) ;
215- }
225+ public void SetFieldOfNewEntityTest ( )
226+ {
227+ using ( var session = Domain . OpenSession ( ) )
228+ using ( var t = session . OpenTransaction ( ) ) {
229+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
230+ var myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
231+ accessor . SetFieldValue ( myEntity , myEntity . TypeInfo . Fields [ "Value" ] , "Value" ) ;
232+ Assert . AreEqual ( "Value" , myEntity . Value ) ;
233+ Assert . That ( myEntity . PersistenceState , Is . EqualTo ( PersistenceState . New ) ) ;
234+ t . Complete ( ) ;
235+ }
236+ }
237+
238+ [ Test ]
239+ public void SetFieldOfExistingEntityTest ( )
240+ {
241+ var entityId = 0 ;
242+ var updatedValue = string . Empty ;
243+ using ( var session = Domain . OpenSession ( ) )
244+ using ( var t = session . OpenTransaction ( ) ) {
245+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
246+ var myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
247+ entityId = myEntity . Id ;
248+ t . Complete ( ) ;
249+ }
250+
251+ using ( var session = Domain . OpenSession ( ) )
252+ using ( var t = session . OpenTransaction ( ) ) {
253+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
254+ var myEntity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
255+ updatedValue = "Value" ;
256+ accessor . SetFieldValue ( myEntity , myEntity . TypeInfo . Fields [ "Value" ] , updatedValue ) ;
257+ Assert . AreEqual ( updatedValue , myEntity . Value ) ;
258+ Assert . That ( myEntity . PersistenceState , Is . EqualTo ( PersistenceState . Modified ) ) ;
259+ t . Complete ( ) ;
260+ }
261+
262+ using ( var session = Domain . OpenSession ( ) )
263+ using ( var t = session . OpenTransaction ( ) ) {
264+ var myEntity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
265+ Assert . That ( myEntity . Value , Is . EqualTo ( updatedValue ) ) ;
266+ }
267+ }
268+
269+ [ Test ]
270+ public void SetFieldOfStructureTest ( )
271+ {
272+ using ( var session = Domain . OpenSession ( ) )
273+ using ( var t = session . OpenTransaction ( ) ) {
274+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
275+ var myStructure = ( MyStructure ) accessor . CreateStructure ( typeof ( MyStructure ) ) ;
276+ accessor . SetFieldValue ( myStructure , myStructure . TypeInfo . Fields [ "Value" ] , "Value" ) ;
277+ Assert . AreEqual ( "Value" , myStructure . Value ) ;
278+ Assert . That ( myStructure . Owner , Is . Null ) ;
279+ t . Complete ( ) ;
216280 }
217281 }
218282
219283 [ Test ]
220284 public void RemoveTest ( )
221285 {
222- using ( var session = Domain . OpenSession ( ) ) {
223- using ( var t = session . OpenTransaction ( ) ) {
224- var accessor = Session . Current . Services . Get < DirectPersistentAccessor > ( ) ;
225- MyEntity myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
226- Key key = myEntity . Key ;
227- Assert . IsNotNull ( session . Query . SingleOrDefault ( key ) ) ;
228- myEntity . Session . Services . Get < DirectPersistentAccessor > ( ) . Remove ( myEntity ) ;
229- Assert . AreEqual ( PersistenceState . Removed , myEntity . PersistenceState ) ;
230- Assert . IsNull ( session . Query . SingleOrDefault ( key ) ) ;
231- t . Complete ( ) ;
232- }
286+ using ( var session = Domain . OpenSession ( ) )
287+ using ( var t = session . OpenTransaction ( ) ) {
288+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
289+ var myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
290+ var key = myEntity . Key ;
291+ Assert . IsNotNull ( session . Query . SingleOrDefault ( key ) ) ;
292+ accessor . Remove ( myEntity ) ;
293+ Assert . AreEqual ( PersistenceState . Removed , myEntity . PersistenceState ) ;
294+ Assert . IsNull ( session . Query . SingleOrDefault ( key ) ) ;
295+ t . Complete ( ) ;
233296 }
234297 }
235298
236299 [ Test ]
237300 public void EntitySetTest ( )
238301 {
239- using ( var session = Domain . OpenSession ( ) ) {
240- using ( var t = session . OpenTransaction ( ) ) {
241- var pa = Session . Current . Services . Get < DirectPersistentAccessor > ( ) ;
242- MyEntity container = ( MyEntity ) pa . CreateEntity ( typeof ( MyEntity ) ) ;
243- MyEntity item1 = ( MyEntity ) pa . CreateEntity ( typeof ( MyEntity ) ) ;
244- MyEntity item2 = ( MyEntity ) pa . CreateEntity ( typeof ( MyEntity ) ) ;
245-
246- var entitySetAccessor = Session . Current . Services . Get < DirectEntitySetAccessor > ( ) ;
247- var field = container . TypeInfo . Fields [ "Items" ] ;
248- var entitySet = entitySetAccessor . GetEntitySet ( container , field ) ;
249- entitySetAccessor . Add ( entitySet , item1 ) ;
250- entitySetAccessor . Add ( entitySet , item2 ) ;
251- Assert . AreEqual ( 2 , entitySet . Count ) ;
252- entitySetAccessor . Remove ( entitySet , item2 ) ;
253- Assert . AreEqual ( 1 , entitySet . Count ) ;
254- entitySetAccessor . Clear ( entitySet ) ;
255- Assert . AreEqual ( 0 , entitySet . Count ) ;
256- t . Complete ( ) ;
257- }
302+ using ( var session = Domain . OpenSession ( ) )
303+ using ( var t = session . OpenTransaction ( ) ) {
304+ var pa = session . Services . Get < DirectPersistentAccessor > ( ) ;
305+ var container = ( MyEntity ) pa . CreateEntity ( typeof ( MyEntity ) ) ;
306+ var item1 = ( MyEntity ) pa . CreateEntity ( typeof ( MyEntity ) ) ;
307+ var item2 = ( MyEntity ) pa . CreateEntity ( typeof ( MyEntity ) ) ;
308+
309+ var entitySetAccessor = session . Services . Get < DirectEntitySetAccessor > ( ) ;
310+ var field = container . TypeInfo . Fields [ "Items" ] ;
311+ var entitySet = entitySetAccessor . GetEntitySet ( container , field ) ;
312+ _ = entitySetAccessor . Add ( entitySet , item1 ) ;
313+ _ = entitySetAccessor . Add ( entitySet , item2 ) ;
314+ Assert . AreEqual ( 2 , entitySet . Count ) ;
315+ _ = entitySetAccessor . Remove ( entitySet , item2 ) ;
316+ Assert . AreEqual ( 1 , entitySet . Count ) ;
317+ entitySetAccessor . Clear ( entitySet ) ;
318+ Assert . AreEqual ( 0 , entitySet . Count ) ;
319+ t . Complete ( ) ;
320+ }
321+ }
322+
323+ [ Test ]
324+ public void SetReferenceFieldForNewEntity ( )
325+ {
326+ var entityId = 0 ;
327+ var entityRefId = 0 ;
328+ using ( var session = Domain . OpenSession ( ) )
329+ using ( var t = session . OpenTransaction ( ) ) {
330+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
331+ var myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
332+ var referenceEntity = new MyRefEntity ( ) ;
333+ var field = myEntity . TypeInfo . Fields [ "Reference" ] ;
334+ entityId = myEntity . Id ;
335+ entityRefId = referenceEntity . Id ;
336+
337+ accessor . SetReferenceKey ( myEntity , field , referenceEntity . Key ) ;
338+
339+ t . Complete ( ) ;
340+ }
341+
342+ using ( var session = Domain . OpenSession ( ) )
343+ using ( var t = session . OpenTransaction ( ) ) {
344+ var entity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
345+ Assert . That ( entity . Reference , Is . Not . Null ) ;
346+ Assert . That ( entity . Reference . Id , Is . EqualTo ( entityRefId ) ) ;
347+ }
348+ }
349+
350+ [ Test ]
351+ public void SetReferenceFieldOfExistingEntity ( )
352+ {
353+ var entityId = 0 ;
354+ var entityRefId = 0 ;
355+ using ( var session = Domain . OpenSession ( ) )
356+ using ( var t = session . OpenTransaction ( ) ) {
357+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
358+ var myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
359+ entityId = myEntity . Id ;
360+ entityRefId = new MyRefEntity ( ) . Id ;
361+ t . Complete ( ) ;
362+ }
363+
364+ using ( var session = Domain . OpenSession ( ) )
365+ using ( var t = session . OpenTransaction ( ) ) {
366+ var myEntity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
367+ var referenceEntity = session . Query . All < MyRefEntity > ( ) . First ( e => e . Id == entityRefId ) ;
368+
369+ var field = myEntity . TypeInfo . Fields [ "Reference" ] ;
370+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
371+ accessor . SetReferenceKey ( myEntity , field , referenceEntity . Key ) ;
372+ t . Complete ( ) ;
373+ }
374+
375+ using ( var session = Domain . OpenSession ( ) )
376+ using ( var t = session . OpenTransaction ( ) ) {
377+ var myEntity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
378+ Assert . That ( myEntity . Reference , Is . Not . Null ) ;
379+ Assert . That ( myEntity . Reference . Id , Is . EqualTo ( entityRefId ) ) ;
380+ }
381+ }
382+
383+ [ Test ]
384+ public void SetReferenceFieldOfExistingEntityWithSameKeyTest ( )
385+ {
386+ var entityId = 0 ;
387+ var entityRefId = 0 ;
388+ var referenceKey = ( Key ) null ;
389+ using ( var session = Domain . OpenSession ( ) )
390+ using ( var t = session . OpenTransaction ( ) ) {
391+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
392+ var myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
393+ var referenceEntity = new MyRefEntity ( ) ;
394+ var field = myEntity . TypeInfo . Fields [ "Reference" ] ;
395+ entityId = myEntity . Id ;
396+ entityRefId = referenceEntity . Id ;
397+ referenceKey = referenceEntity . Key ;
398+
399+ accessor . SetReferenceKey ( myEntity , field , referenceEntity . Key ) ;
400+ t . Complete ( ) ;
401+ }
402+
403+ using ( var session = Domain . OpenSession ( ) )
404+ using ( var t = session . OpenTransaction ( ) ) {
405+ var myEntity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
406+
407+ var field = myEntity . TypeInfo . Fields [ "Reference" ] ;
408+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
409+ accessor . SetReferenceKey ( myEntity , field , referenceKey ) ;
410+ Assert . That ( myEntity . PersistenceState , Is . EqualTo ( PersistenceState . Synchronized ) ) ;
411+ t . Complete ( ) ;
412+ }
413+
414+ using ( var session = Domain . OpenSession ( ) )
415+ using ( var t = session . OpenTransaction ( ) ) {
416+ var myEntity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
417+ Assert . That ( myEntity . Reference , Is . Not . Null ) ;
418+ Assert . That ( myEntity . Reference . Id , Is . EqualTo ( entityRefId ) ) ;
419+ }
420+ }
421+
422+ [ Test ]
423+ public void SetReferenceFieldOfExistingEntityWithEquivalentKeyTest ( )
424+ {
425+ var entityId = 0 ;
426+ var entityRefId = 0 ;
427+ using ( var session = Domain . OpenSession ( ) )
428+ using ( var t = session . OpenTransaction ( ) ) {
429+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
430+ var myEntity = ( MyEntity ) accessor . CreateEntity ( typeof ( MyEntity ) ) ;
431+ var referenceEntity = new MyRefEntity ( ) ;
432+ var field = myEntity . TypeInfo . Fields [ "Reference" ] ;
433+ entityId = myEntity . Id ;
434+ entityRefId = referenceEntity . Id ;
435+
436+ accessor . SetReferenceKey ( myEntity , field , referenceEntity . Key ) ;
437+ t . Complete ( ) ;
438+ }
439+
440+ using ( var session = Domain . OpenSession ( ) )
441+ using ( var t = session . OpenTransaction ( ) ) {
442+ var myEntity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
443+
444+ var field = myEntity . TypeInfo . Fields [ "Reference" ] ;
445+ var accessor = session . Services . Get < DirectPersistentAccessor > ( ) ;
446+
447+ var referenceKey = Key . Create ( Domain , typeof ( MyRefEntity ) , TypeReferenceAccuracy . ExactType , entityRefId ) ;
448+ accessor . SetReferenceKey ( myEntity , field , referenceKey ) ;
449+ Assert . That ( myEntity . PersistenceState , Is . EqualTo ( PersistenceState . Synchronized ) ) ;
450+
451+ referenceKey = Key . Create ( Domain , typeof ( MyRefEntity ) , TypeReferenceAccuracy . BaseType , entityRefId ) ;
452+ accessor . SetReferenceKey ( myEntity , field , referenceKey ) ;
453+ Assert . That ( myEntity . PersistenceState , Is . EqualTo ( PersistenceState . Synchronized ) ) ;
454+
455+ referenceKey = Key . Create ( Domain , typeof ( MyRefEntity ) , TypeReferenceAccuracy . Hierarchy , entityRefId ) ;
456+ accessor . SetReferenceKey ( myEntity , field , referenceKey ) ;
457+ Assert . That ( myEntity . PersistenceState , Is . EqualTo ( PersistenceState . Synchronized ) ) ;
458+ t . Complete ( ) ;
459+ }
460+
461+ using ( var session = Domain . OpenSession ( ) )
462+ using ( var t = session . OpenTransaction ( ) ) {
463+ var myEntity = session . Query . All < MyEntity > ( ) . First ( e => e . Id == entityId ) ;
464+ Assert . That ( myEntity . Reference , Is . Not . Null ) ;
465+ Assert . That ( myEntity . Reference . Id , Is . EqualTo ( entityRefId ) ) ;
258466 }
259467 }
260468 }
0 commit comments