首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何指定属性应该生成文本列而不是nvarchar(4000)

如何指定属性应该生成文本列而不是nvarchar(4000)
EN

Stack Overflow用户
提问于 2011-02-04 07:13:38
回答 12查看 57.7K关注 0票数 53

我正在使用的Code特性,并试图了解如何指定在自动生成数据库时应该创建的列数据类型。

我有一个简单的模型:

代码语言:javascript
运行
复制
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; }
}

在运行应用程序时,将使用以下模式自动创建SQLCE4.0数据库:

到现在为止还好!但是,我将插入到BodyBodyHtml属性中的数据通常大于NVarChar列类型允许的最大长度,因此我希望EF为这些属性生成Text列。

然而,我似乎没有办法做到这一点!在进行了相当多的搜索和阅读之后,我尝试使用DataAnnotations这个答案中找到的信息中指定列类型。

代码语言:javascript
运行
复制
using System.ComponentModel.DataAnnotations;

...

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

这会引发以下异常(当数据库被删除并应用程序重新运行时):

代码语言:javascript
运行
复制
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.

但是我不知道我应该指定什么名称空间或别名,也找不到任何能告诉我的东西。

我还尝试按照本参考更改注释。

代码语言:javascript
运行
复制
using System.Data.Linq.Mapping;

...

[Column(DbType = "Text")]
public string Body { get; set; }

在本例中,创建了一个数据库,但Body列仍然是一个NVarChar(4000),因此似乎忽略了注释。

有人能帮忙吗?这似乎是一个相当普遍的要求,但我的搜索一直没有结果!

EN

Stack Overflow用户

发布于 2011-02-23 18:32:26

使用字符串长度属性的问题。

代码语言:javascript
运行
复制
[StringLength(4010)]

任何字符串>属性中定义的字符数都将触发验证异常,这种异常与在列上使用非定义字段大小的任何原因相反,或者在属性中使用一个巨大的数字,从而丢失由属性提供的任何验证。最终,如果使用StringLength属性,您将使用验证机制来解决映射问题,因为使用列属性作为Marcel的答案是一个更好的解决方案,因为它使用映射属性来定义类型,并且仍然允许您使用StringLength属性进行验证。

另一种选择是使用EF4 CTP5 fluent API,并在DbContext中的OnModelCreating事件中定义列映射。

代码语言:javascript
运行
复制
protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Article>()
    .Property(p => p.Body)
    .HasColumnType("nvarchar(max)");
}

另外,应该注意的是,NText是一种不推荐的数据类型(ntext、text和image (Transact-SQL) MS联机丛书),建议使用NVarChar(MAX)代替它。

票数 6
EN
查看全部 12 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4895465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档