Отображение полей в BLToolkit на свойства типа класса - PullRequest
3 голосов
/ 15 мая 2011

Моя схема таблицы (отрывок)

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).

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

Ответы [ 2 ]

4 голосов
/ 16 мая 2011

Рабочее решение

Я действительно начинаю ненавидеть 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; }
    }
}

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

0 голосов
/ 20 мая 2013

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

...