首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-02-06 13:38:24

我很感激对现有答案所付出的努力,但我还没有发现它真的回答了这个问题.所以我测试了这个,然后发现

代码语言:javascript
运行
复制
[Column(TypeName = "ntext")]
public string Body { get; set; }

(来自System.ComponentModel.DataAnnotations的)将用于创建ntext类型列。

(我所接受的答案的问题是,它似乎表明您应该更改接口中的列类型,但问题是如何以编程的方式进行。)

票数 79
EN

Stack Overflow用户

发布于 2011-03-21 10:53:28

您可以使用以下DataAnnotation,代码优先将生成数据库允许的最大大小的数据类型。在Sql的情况下,它会产生一个底层ntext列。

代码语言:javascript
运行
复制
[MaxLength]

或者使用EF4.1RC fluent API..。

代码语言:javascript
运行
复制
protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Article>()
        .Property(p => p.Body)
        .IsMaxLength();
}
票数 33
EN

Stack Overflow用户

发布于 2011-02-04 08:13:36

你试过ntext了吗?我刚刚创建了一个SQLCE4.0数据库,当我手动向表中添加列时,我注意到text在数据类型列表中不可用,而ntext是可用的。就像你可以选择nvarchar,但不能选择varchar

不幸的是,您可以选择的最大nvarchar大小是4000。因此,nvarchar(max)也不是一个选项。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4895465

复制
相关文章

相似问题

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