Как использовать поля базового класса для создания уникального индекса объединения в XPO - PullRequest
0 голосов
/ 30 апреля 2020

Поскольку в моем классе сущностей много одинаковых полей, таких как id, org_id и т. Д. c., Я написал наследование базового класса, так что каждому подклассу не нужно записывать эти поля больше.

У меня есть базовый класс:

[OptimisticLocking(false), NonPersistent]
public class BaseOrganization : XPBaseObject
{
    public BaseOrganization(Session session) : base(session) { }

    private Organization _organization;
    [Association, NoForeignKey, Persistent("org_id")]
    public Organization organization
    {
        get { return _organization; }
        set { SetPropertyValue(nameof(organization), ref _organization, value); }
    }
}

Производный подкласс:

[Persistent("company")]
public class Company : BaseOrganization
{
    public Company(Session session) : base(session) { }

    private string _code;
    [Size(100), Nullable(false), Indexed(nameof(organization), Name = "IX_company", Unique = true)]
    public string code
    {
        get { return _code; }
        set { SetPropertyValue(nameof(code), ref _code, value); }
    }

    private string _name;
    [Size(100), Nullable(false)]
    public string name
    {
        get { return _name; }
        set { SetPropertyValue(nameof(name), ref _name, value); }
    }
}

Появляется следующее сообщение об ошибке:

The association attribute cannot be used for member `Precise.Model.BaseOrganization.organization` because class `Precise.Model.BaseOrganization` is not persistent.

Если я удаляю постоянную идентификацию базового класса:

[OptimisticLocking(false)]
public class BaseOrganization : XPBaseObject
{
    public BaseOrganization(Session session) : base(session) { }

    private Organization _organization;
    [Association, NoForeignKey, Persistent("org_id")]
    public Organization organization
    {
        get { return _organization; }
        set { SetPropertyValue(nameof(organization), ref _organization, value); }
    }
}

Производный подкласс:

[Persistent("company")]
public class Company : BaseOrganization
{
    public Company(Session session) : base(session) { }

    private string _code;
    [Size(100), Nullable(false), Indexed(nameof(organization), Name = "IX_company", Unique = true)]
    public string code
    {
        get { return _code; }
        set { SetPropertyValue(nameof(code), ref _code, value); }
    }

    private string _name;
    [Size(100), Nullable(false)]
    public string name
    {
        get { return _name; }
        set { SetPropertyValue(nameof(name), ref _name, value); }
    }
}

Ошибка подсказки во время выполнения: Свойство organization не существует в типе Precise.Model.Models.Company.

1 Ответ

0 голосов
/ 01 мая 2020

Если вы добавите атрибут Association к свойству organization, свойство коллекции в классе Organization не сможет извлечь связанные записи, поскольку класс BaseOrganization непостоянен.

Если вам не нужно свойство коллекции в классе Organization, удалите атрибут Association. Если вы удалите его, вы можете оставить атрибут NonPersistent в базовом классе.

...