如何指定属性生成TEXT列而不是nvarchar(4000)?

53

我正在使用Entity Framework的Code First特性,并且正在尝试弄清楚如何在自动生成数据库时指定应创建哪些列数据类型。

我有一个简单的模型:

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<Comment> Comments { get; set; }
}
当我运行我的应用程序时,会自动创建一个具有以下架构的SQL CE 4.0数据库: DB Schema 目前为止,一切顺利!然而,我将插入到BodyBodyHtml属性中的数据通常大于NVarChar列类型允许的最大长度,因此我希望EF为这些属性生成Text列。
但是,我似乎找不到方法来实现这一点!经过一番谷歌搜索和阅读后,我尝试使用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; }
在这种情况下,数据库确实被创建了,但是Body列仍然是一个NVarChar(4000),因此似乎注释被忽略了。
有人能帮忙吗?这似乎应该是一个相当常见的需求,但我的搜索一直没有结果!

3
CE支持文本吗?在数据类型列表中,我可以看到ntext,但没有text。 - Damien_The_Unbeliever
@Damien,你说得对,谢谢 - 请将此作为答案添加(并添加数据类型列表的链接),我会接受它。 - Mark Bell
我找不到数据类型的在线列表 - 我不得不下载CE BOL进行检查。看起来Kristof Claes已经添加了一个涵盖相同内容的答案。 - Damien_The_Unbeliever
@Damien - 是的,对不起。当我开始打我的答案时,我没有看到你的评论。 - Kristof Claes
那我就接受Kristof的答案了,谢谢大家的帮助! - Mark Bell
12个回答

1

你尝试过小写的"text"吗?根据MSDN讨论,数据提供程序是区分大小写的。


我已经尝试过了,但没有任何区别:生成的列仍然是varchar。感谢提供有用的讨论链接,看起来还有其他一些方法可以尝试,我会仔细阅读。 - Mark Bell

1
如果您不想为所有属性添加注释并且使用现代 EF,请使用约定:
public class StringNTextConvention : Convention {
  public StringNTextConvention() {
    Properties<string>().Configure(p => p.HasColumnType("ntext"));                    
  }
}

您可以从您的onModelCreating()中调用它:
modelBuilder.Conventions.Add(new StringNTextConvention());

所有您的 string 将自动转换为 ntext 列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接