Добавление новых скалярных типов в EF 4 - PullRequest
4 голосов
/ 29 июня 2010

Платформа сущностей сопоставляет типы БД с типами .NET, например, BigInt SQL Server сопоставляется с long .NET.

Можно ли создать новый тип и привязать к нему тип магазина (например, BigInt или VarChar)? Если да, то как?

К вашему сведению, моя цель - изменить способ, которым скаляр .NET записывает свое значение в запрос, и, в частности, способ записи значения по умолчанию (я пытаюсь использовать ключевое слово default SQL Server для решения таких проблем, как это ).

Спасибо
Асаф

Обновление
Нашел сообщение для EF 1, в котором говорится, что это невозможно сделать . Я не уверен, что это правильно для своего времени, и я даже менее уверен, что это актуально для EF 4.

Ответы [ 2 ]

3 голосов
/ 29 июня 2010

Я почти уверен, что вы не можете создавать новые скалярные типы даже в EF4.0.

То, что вы на самом деле можете сделать, - это создать сложный тип, охватывающий скалярный тип.Сложные типы поддерживаются конструктором в VS2010.

<ComplexType Name="DateTimeWrapper" >
  <Property Type="DateTime" Name="Value" Nullable="false" />
</ComplexType>

Укажите любое значение по умолчанию и несколько операторов неявного преобразования.

public class DateTimeWrapper
    {
        private DateTime _value = DateTime.Now;

        public DateTime Value
        {
            get { return _value; }
            set { _value = value; }
        }

        public static implicit operator DateTime(DateTimeWrapper wrapper)
        {
            if (wrapper == null) return DateTime.Now;
            return wrapper.Value;
        }

        public static implicit operator DateTimeWrapper(DateTime date)
        {
            return new DateTimeWrapper { Value = date };
        }
    }

Таким образом, у каждого объекта, имеющего комплексное свойство DateTimeWrapper тип будет правильно инициализирован.И вы можете использовать следующий синтаксис: MyEntity.MyDateTimeWrapperProp = DateTime.UtcNow при создании и изменении объектов.

Но в запросах вам придется написать MyEntities.Where(ent => ent.MyDateTimeWrapperProp.Value == ...).

0 голосов
/ 29 июня 2010

Короткий ответ : Нет простого способа сделать это.

Длинный ответ

Модель структуры объектаописывается с использованием 3 подъязыков - SSDL, CSDL и MSL.

На концептуальном уровне ( CSDL ) - элемент свойства типа будет местомк этому.Тип элемента свойства может быть одним из предопределенных значений EDMSimpleType или ComplexType, который представляет собой набор элементов ComplexType и EDMSimpleType.Уровень CSDL не место для этого.

Уровень отображения ( MSL ) просто соответствует элементам хранения и концептуальным элементам.Здесь нет места для этого.

Мы остались с уровнем хранилища ( SSDL ).Тип элемента SSDL элемента строго не определен в MSDN, и в любом случае может оказаться возможным переопределить уровень провайдера, чтобы предоставить различные функциональные возможности для существующих типов.Но это не тривиально и не рекомендуется.

Заключение : Нет практического способа добавить новые скалярные типы (кроме прямой коллекции простых типов, например ComplexType).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...