Skip to content

Commit b166f01

Browse files
authored
Merge pull request #82 from DataObjects-NET/setreference-problem
Registers entity changed by DirectPersistentAccessor.SetReferenceKey as modified
2 parents b5d188a + d624aa9 commit b166f01

File tree

5 files changed

+602
-328
lines changed

5 files changed

+602
-328
lines changed

Orm/Xtensive.Orm.Tests/Storage/CoreServicesTest.cs

Lines changed: 264 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
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

77
using System;
8+
using System.Linq;
89
using System.Reflection;
910
using NUnit.Framework;
1011
using 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

177198
namespace 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

Comments
 (0)