Сопоставление полей в BLToolkit со свойствами класса

Схема моей таблицы (отрывок)

create table dbo.MyEntity
(
    MyEntityID int identity not null
        primary key,
    Name nvarchar(50) not null
        unique,
    Description nvarchar(500) null,
    -- these two are optional fields
    MaxCount int null,
    MinSpace int null
)

Класс(ы) объекта

[MapField("MaxCount", "Rule.MaxCount")]
[MapField("MinSpace", "Rule.MinSpace")]
public class MyEntity
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    // when values are not null this property should have an instance
    public MyEntityRule Rule { get; set; }

    public bool HasRule
    {
        get { return this.Rule != null; }
    }
}

public class MyEntityRule
{
    public int MaxCount { get; set; }

    public int MinSpace { get; set; }
}

Проблема?

Сопоставление полей с моим классом является проблемой. Я хотел бы напрямую сопоставить свойства внутреннего класса из плоского набора результатов, который поступает из таблицы данных (вверху).

Я установил настройки MapFieldAttribute на уровне класса (как показано в верхнем коде), но мои правила всегда нулевые. Предположим, что часть проблемы заключается в том, что это свойство внутреннего класса должно быть создано первым, чтобы быть назначенным, потому что все примеры BLToolkit используют внутренние объекты, не допускающие значение NULL. Но в моем случае я не хочу создавать его экземпляр, если он должен быть null (в большинстве случаев это будет null).

Как это нужно сделать тогда?


person Robert Koritnik    schedule 15.05.2011    source источник


Ответы (2)


Рабочий раствор

Я действительно начинаю ненавидеть BLToolkit из-за очень ограниченной документации и поддержки сообщества или ее отсутствия (по крайней мере, на английском языке).

Я просто тестировал различные атрибуты, которые могут быть связаны с этим, и на самом деле я заставил это работать.

Если вы хотите, чтобы вложенные объекты работали должным образом, вы должны использовать дополнительный файл NoInstanceAttribute. И вы должны сохранить эти атрибуты сопоставления полей в классе, как и раньше. В результате рабочий код выглядит следующим образом:

[MapField("MaxCount", "Rule.MaxCount")]
[MapField("MinSpace", "Rule.MinSpace")]
public class MyEntity
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    [NoInstance] // this will make it work
    public MyEntityRule Rule { get; set; }

    public bool HasRule
    {
        get { return this.Rule != null; }
    }
}

Все правила, не определяющие значения, являются нулевыми, другие создаются экземплярами.

person Robert Koritnik    schedule 16.05.2011

BLToolkit не создает экземпляр MyEntityRule Вы должны сделать это самостоятельно.

person IT.    schedule 19.05.2013