Как указать, что свойство должно генерировать столбец TEXT, а не nvarchar (4000)

Я работаю с функцией Code First для Entity Framework, и я пытаюсь выяснить, как я могу указать типы данных столбцов, которые должны быть созданы, когда firebase database автоматически сгенерирована.

У меня простая модель:

public class Article { public int ArticleID { get; set; } public string Title { get; set; } public string Author { get; set; } public string Summary { get; set; } public string SummaryHtml { get; set; } public string Body { get; set; } public string BodyHtml { get; set; } public string Slug { get; set; } public DateTime Published { get; set; } public DateTime Updated { get; set; } public virtual ICollection Comments { get; set; } } 

Когда я запускаю свое приложение, firebase database SQL CE 4.0 автоматически создается со следующей схемой:

Схема БД

Все идет нормально! Однако данные, которые я буду вставлять в свойства Body и BodyHtml обычно больше максимально допустимой длины для NVarChar столбца NVarChar , поэтому я хочу, чтобы EF генерировал столбцы Text для этих свойств.

Однако я не могу найти способ сделать это! После довольно DataAnnotations и чтения я попытался указать тип столбца, используя DataAnnotations , из информации, найденной в этом ответе :

 using System.ComponentModel.DataAnnotations; ... [Column(TypeName = "Text")] public string Body { get; set; } 

Это вызывает следующее исключение (при удалении базы данных и повторном запуске приложения):

 Schema specified is not valid. Errors: (12,6) : error 0040: The Type text is not qualified with a namespace or alias. Only PrimitiveTypes can be used without qualification. 

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

Я также попытался изменить аннотацию в соответствии с этой ссылкой :

 using System.Data.Linq.Mapping; ... [Column(DbType = "Text")] public string Body { get; set; } 

В этом случае создается firebase database, но столбец Body по-прежнему является NVarChar(4000) , поэтому кажется, что аннотация игнорируется.

Может ли кто-нибудь помочь? Похоже, это должно быть довольно распространенным требованием, но мои поиски оказались бесплодными!

    Я ценю усилия, которые вошли в существующий ответ, но я не нашел его на самом деле ответом на вопрос … поэтому я проверил это и выяснил, что

     [Column(TypeName = "ntext")] public string Body { get; set; } 

    (один из System.ComponentModel.DataAnnotations ) будет работать для создания столбца типа текста.

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

    Вы можете использовать следующие DataAnnotation, а Code-First создаст тип данных максимального размера, который позволяет firebase database. В случае Sql CE он приводит к базовому столбцу ntext.

     [MaxLength] 

    или с использованием API-интерфейса EF 4.1 RC …

     protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity
    () .Property(p => p.Body) .IsMaxLength(); }

    Вы пробовали ntext ? Я только что создал базу данных SQL CE 4.0, и когда я вручную добавляю столбец в таблицу, я замечаю, что text недоступен в списке типов данных, пока ntext . Так же, как вы можете выбрать nvarchar но не varchar .

    К сожалению, самый большой размер nvarchar вы можете выбрать, – 4000. Таким образом, nvarchar(max) также не является вариантом.

    Существует ntext, но нет текста

    Проблема с использованием атрибута длины строки, например

     [StringLength(4010)] 

    Это любая строка> количество символов, определенных в атрибуте, вызовет исключение проверки, какой тип идет против любой причины, по которой вы использовали бы не определенный размер поля в столбце, или используете огромное количество в атрибуте и теряете любая валидация, предлагаемая атрибутом. В конечном счете вы используете механизм проверки, чтобы решить проблему сопоставления, если вы используете атрибут StringLength, где ответ Марселя Попеску с использованием атрибута Column является гораздо лучшим решением, поскольку он использует атрибуты сопоставления для определения типа и по-прежнему позволяет использовать атрибут StringLength для проверки.

    Другим вариантом является использование свободного API EF4 CTP5 и определение сопоставления столбцов в событии OnModelCreating в DbContext, например

     protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity
    () .Property(p => p.Body) .HasColumnType("nvarchar(max)"); }

    Также следует отметить, что NText – это устаревший тип данных ( ntext, text и image (Transact-SQL) MS Books Online ), и рекомендуется использовать NVarChar (MAX) на своем месте

    Вы можете использовать System.ComponentModel.DataAnnotations.Schema.ColumnAttribute

     [Column(TypeName="text")] public string Text { get; set; } 

    или через Fluent API:

     modelBuilder.Entity() .Property( e => e.Text) .HasColumnType("text"); 

    Я знаю, это, вероятно, слишком поздно, но:

    Использование:

     [StringLength(-1)] 

    Это создаст поле nText. Мне удалось сохранить не менее 25 Кбайт в этом поле, используя базу данных Compact Edition 4.0.

    Вы пробовали строчный "text" ? В этом обсуждении MSDN поставщик данных чувствителен к регистру.

    Эта DataAnnotation заставит Code-First генерировать столбец nvarchar (MAX) в sql

     [StringLength(1073741822)] 

    Не уверен, что другие большие числа делают то же самое … Я получил это, используя калькулятор и спецификацию nvarchar (MAX).

    Я пробовал это с помощью SQL Server 2005 Express или нет, но не с CE

    Я использую его, и он работает, но я хотел бы знать, если это хорошая идея или если я что-то упустил … есть ли другой способ сделать код первым знать, что я хочу nvarchar (MAX)?

    Эта DataAnnotation заставит Code-First генерировать столбец nvarchar (MAX) в sql 🙂

     [StringLength(4010)] 

    Согласитесь, что TypeName = "ntext" работает, хотя я также должен добавить:

     [StringLength(Int32.MaxValue)] 

    чтобы остановить длину строки по умолчанию 128 в пути.

    Если вы не хотите комментировать все свои свойства и используете современный EF, используйте соглашение:

     public class StringNTextConvention : Convention { public StringNTextConvention() { Properties().Configure(p => p.HasColumnType("ntext")); } } 

    Вы можете вызвать его из вашего onModelCreating() :

     modelBuilder.Conventions.Add(new StringNTextConvention()); 

    и все ваши string s автоматически ntext столбцы ntext .

    Если вы добавляете-перенастраиваете и обновляете-базу данных с помощью диспетчера пакетов, вы можете изменить таблицу create, добавив storeType следующим образом:

      CreateTable( "dbo.Table_Name", c => new { ID = c.Int(nullable: false, identity: true), Title = c.String(nullable: false, maxLength: 500), Body = c.String(unicode: false, storeType: "ntext"), }) .PrimaryKey(t => t.ID); 
    Давайте будем гением компьютера.