SubSonic SimpleRepository, хранящий класс члена - PullRequest
0 голосов
/ 31 июля 2010

Я новичок в C # и Subsonic.Я пытаюсь решить следующий случай:

public class UnknownInt { 
  public int val;
  public bool known;
}

public class Record {
  public int ID;
  public UnknownInt data;
}

Я использую SimpleRepository.Можно ли как-нибудь сериализовать UnknownInt перед его сохранением в базе данных SQL (возможно, в виде текстового поля XML?)

Я пытаюсь создать систему вопросников, в которой пользователь может предоставить «целочисленный» ответ, «Неизвестный» ответ, а также пустой ответ (вопрос еще не отвечен)

Другими словами - какие интерфейсы должен реализовать мой класс UnknownInt, чтобы иметь право и быть преобразованным в простой репозиторий SubSonic 3.0?

Ура!

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

Я бы сделал это:

public class Record
{
    public int ID {get;set;}

    [EditorBrowsable(EditorBrowsableState.Never)]
    public int UnknownIntValue {get;set;}

    [EditorBrowsable(EditorBrowsableState.Never)]
    public bool UnknownIntKnown {get;set;}

    [SubSonicIgnore]
    public UnknownInt UnknownInt
    {
        get
        {
            return new UnknownInt()
            {
                val = UnknownIntValue,
                known = this.UnknownIntKnown
            };
        }
        set
        {
             this.UnknownIntValue = value.val;
             this.UnknownIntKnown = value.known;
        }
    }

}

public struct UnknownInt
{ 
    public readonly int Val;
    public readonly bool Known;

    public UnknownInt(int val, bool known) 
    {
        this.Val = val;
        this.Known = known;
    }

    public override string ToString()
    {
        return String.Format("{0} ({1})",
           Val, Known == true ? "known" : "unknown");
    }
    public override bool Equals(Object obj) 
    {
       return obj is UnknownInt && this == (UnknownInt)obj;
    }
    public static bool operator ==(UnknownInt x, UnknownInt y) 
    {
       return x.Val == y.Val && x.Known == y.Known;
    }
    public static bool operator !=(UnknownInt x, UnknownInt y) 
    {
       return !(x == y);
    }

}

Основная идея состоит в том, чтобы иметь столбцы, в которых хранится пользовательский тип, но который скрыт от intellisense (атрибут System.ComponentModel.EditorBrowsable). Если у вас есть сложный тип (в данном случае я предпочитаю структуру, а не класс), который скрыт от простого хранилища SubSonic. Переопределения и перегрузки операторов являются необязательными, но облегчают работу с этим типом.

Пример использования:

// 1. Step Create item1
var item1 = new Record();
item1.ID = 1;
item1.UnknownInt = new UnknownInt(1, true);

// 2. Setp Create item2
var item2 = new Record();
item2.ID = 2;
item2.UnknownImt = new UnknownInt(1, false);

if (item1.UnknownInt == item2.UnknownInt)
    Console.WriteLine("???");
else
    Console.WriteLine("Profit!!!");
0 голосов
/ 01 августа 2010

Попробуйте использовать обнуляемый тип int (int?) Вместо вашего класса UnknownInt - вы можете сохранить его через дозвуковой.Преобразование XML не требуется!

...