Класс сериализации с одним примитивным свойством как «примитивный» столбец в EF - PullRequest
1 голос
/ 20 февраля 2012

Я создал собственный класс C # (4.0) для использования в свойствах классов моделей EF (4.1). Единственное свойство этого пользовательского класса имеет тип Guid. Теперь мне было бы интересно узнать, могу ли я сериализовать свой пользовательский класс в столбец Guid в таблицах моделей, как если бы это был примитивный тип (поддерживаемый SQL Server 2008 R2).

В частности, я не хочу использовать простой Guid в качестве свойства, поскольку свойства модели имеют концептуально отдаленное значение и функциональность от Guid. Я не буду использовать Guid в качестве первичного ключа. Вместо этого я буду использовать его в качестве внешнего ключа для доступа к другой таблице / коллекции, которая имеет неосновной столбец / свойство Guid (и несколько строк / экземпляров с идентичным Guid). Это может показаться надуманным, но это было бы очень удобно для этой конкретной цели.

1 Ответ

1 голос
/ 20 февраля 2012

Вдобавок ко всему, я думаю, что следующий подход может работать с EF:

  1. Давайте добавим столбец GUID к вашей модели и базе данных, но в вашем отображении EF сделайте егополучить и установить методы доступа частные или защищенные соответствующим образом.
  2. Добавьте 2 неявных преобразования в ваш пользовательский класс: одно для преобразования из GUID в экземпляр класса и одно для преобразования из экземпляра класса в GUID (см.ниже, подробнее об этом).
  3. Создайте частичный класс для класса модели, который предоставляет открытое свойство пользовательского типа, а в методах получения и установки просто перейдите к частному / защищенному свойству GUID (которое выВы сможете сделать это благодаря реализации неявных преобразований).

Насколько EF знает, у вас просто есть это свойство Guid, но насколько ваша модель знает, когда выкодируете, у вас просто есть свойство настраиваемого типа.

Чтобы создать неявные преобразования:

public class MyClass
{
    public Guid Key { get; set; }

    public static implicit operator Guid(MyClass c)
    {
        return c.Key;
    }

    public static implicit operator MyClass(Guid g)
    {
        return new MyClass { Key = g; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...