Вопрос касательно статьи о доменных компонентах

StatusIDPriorityType
Closed4707ОбычныйВопрос
ProfileReply
s_tristanClient

Прочел статью, очень понравился подход когда мастер и детали неперсистентные. Сейчас пытаюсь создать базовый неперсистентный иерархический справочник:
- Имя
- Родитель
- Потомки
Что хочется:
- персистентные только наследники, причем для каждого создается отдельная таблица со связью саму на себя
- без добавления дополнительных полей в наследниках (так я уже и сам сделал и не нравится мне в каждом наследнике добавлять свои поля для связей, получается не изящно)
Помогите советом или примером, пожалуйста.

Replies

UserDescriptionPosted On
Александра ЗубрейAgent

Здравствуйте, Станислав!

Ваша проблема принята на рассмотрение.

Постараемся дать ответ в ближайшее время.

Спасибо, Саша.

Сергей Зайцев

Добрый день, Станислав

Предлагаемый Вами вариант реализовать не удастся, поскольку по требованиям XAF типизированная связь Master-Detail должна существовать только между персистентными классами. Именно по этой причине в моем примере (http://xafari.ru/posts/persistentnye-domennye-komponenty.html) во всех пересистентных наследниках явно присутствует реализация связи Master-Detail.

Как вариант можно попробовать реализовать нетипизированную связь, используя только XPWeakReference.

Саша Вам ответит, когда будет получен результат

 

Сергей

s_tristanClient

Сергей, добрый день!

Спасибо за информацию. Был бы крайне признателен за небольшой пример реализации с использованием XPWeakReference

s_tristanClient

Попытался реализовать таким образом:

[DomainComponent]
    [NonPersistentDc]
    public interface ITestWeakReference
    {
        [NonPersistentDc, DevExpress.ExpressApp.DC.Aggregated]
        [BackReferenceProperty("Parent")]
        IList<ITestWeakReference> Children { get; }
 
        [Browsable(false), DevExpress.ExpressApp.DC.Aggregated]
        [PersistentDc]
        XPWeakReferenceStruct Parent { get; set; }
    }
 
    [DomainLogic(typeof(ITestWeakReference))]
    public class TestWeakReferenceLogic : DomainLogicBase<ITestWeakReference>
    {
        public TestWeakReferenceLogic(ITestWeakReference instance)
            : base(instance)
        {
        }
        public IList<ITestWeakReference> Children
        {
            get { return GetWeakList<ITestWeakReference>("Children"); }
        }
 
    }
 
    [DomainComponent]
    public interface ITestWeakReference1 : ITestWeakReference { }
 
    [DomainComponent]
    public interface ITestWeakReference2 : ITestWeakReference { }

На этапе обновления базы данных все ок, но следующий код выдает ошибку на этапе добавления дочернего элемента к родителю:
private readonly Type[] testTypes2 = new[]         {             typeof (ITestWeakReference1),             typeof (ITestWeakReference1)         };
[TestMethod]         public void TestMethod2()         {             foreach (var type in testTypes2)             {                 DataStore.EncloseInTransaction(os =>              {                  for (int i = 0; i < 10; i++)                  {                      var parent = os.CreateObject(type) as ITestWeakReference;                      for (int j = 0; j < 10; j++)                      {                          var child = os.CreateObject(type) as ITestWeakReference;                          parent.Children.Add(child); //здесь выдается ошибка см. ниже                      }                  }              });             }         }

"DevExpress.Data.Filtering.Exceptions.InvalidPropertyPathException: Путь свойства 'Parent.TargetType' неверен для типа 'Creasoft.Tests.TestModule.ITestWeakReference' потому, что 'Creasoft.Tests.TestModule.ITestWeakReference. TargetType' элемент не существует."

Сергей Зайцев

Спасибо за пример.

Попробуем его забрать. Если не затруднит пришлите свой тестовый солюшен. Это позволит быстрее локализовать ошибку

s_tristanClient

Сергей, добрый день!
Тестовое решение во вложении

Сергей Зайцев

Предварительно могу сказать, проблема возникает из за того, что ITestWeakReference1 и ITestWeakReference2 мапируются на отдельные таблицы и в общем случае для получения общей коллекции Children требуется несколько запросов во все возможные наследники ITestWeakReference.

Внутри метода GetWeakList<ITestWeakReference>("Children") используется XPCollection<>.GetObjects(). А этот метод работает только с персистентными сущностями. ITestWeakReference является неперсистентным.

Пока решения для вашего подхода найти не можем.

× This ticket is closed.