我正在使用的Code特性,并试图了解如何指定在自动生成数据库时应该创建的列数据类型。
我有一个简单的模型:
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数据库:

到现在为止还好!但是,我将插入到Body和BodyHtml属性中的数据通常大于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),因此似乎忽略了注释。
有人能帮忙吗?这似乎是一个相当普遍的要求,但我的搜索一直没有结果!
发布于 2011-02-23 18:32:26
使用字符串长度属性的问题。
[StringLength(4010)]任何字符串>属性中定义的字符数都将触发验证异常,这种异常与在列上使用非定义字段大小的任何原因相反,或者在属性中使用一个巨大的数字,从而丢失由属性提供的任何验证。最终,如果使用StringLength属性,您将使用验证机制来解决映射问题,因为使用列属性作为Marcel的答案是一个更好的解决方案,因为它使用映射属性来定义类型,并且仍然允许您使用StringLength属性进行验证。
另一种选择是使用EF4 CTP5 fluent API,并在DbContext中的OnModelCreating事件中定义列映射。
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)代替它。
https://stackoverflow.com/questions/4895465
复制相似问题