实体框架代码优先 MaxLength 和 FixedLegth(char 与 varchar)

Posted

技术标签:

【中文标题】实体框架代码优先 MaxLength 和 FixedLegth(char 与 varchar)【英文标题】:Entity Framework Code First MaxLength and FixedLegth (char vs varchar) 【发布时间】:2015-12-09 20:12:30 【问题描述】:

我有一个实体框架 CodeFirst 模型,它是从现有数据库创建的,我想使用 DataAnnotations 以不同的方式装饰一些 char 和 varchar。

char 和 varchar 的区别在于 Char 的长度是固定的,而 varchar 的长度是可变的。

对于 Varchar,我使用 [Maxlength(length)] 对于 char,这是正确的方法还是有更好的方法来定义类中的字符串属性在数据库中映射为 char?

【问题讨论】:

【参考方案1】:

通过 fluent api,您可以使用 IsFixedLength():

//Set StudentName column size to 50 and change datatype to nchar 
//IsFixedLength() change datatype from nvarchar to nchar
  modelBuilder.Entity<Student>()
                    .Property(p => p.StudentName)
                    .HasMaxLength(50).IsFixedLength();

使用注释,您可以指定类型:

[Column(TypeName = "char")]
[StringLength(2)]
public string MyCharField  get; set; 

【讨论】:

[StringLength] 此处不正确。应该是[MaxLength],这是一个服务器端验证。参考这篇文章:***.com/a/5717297/459102 和 @AaronHudon 这些注释将在 OP 要求的数据库中创建一个固定长度的 CHAR(2) 字段。它具有客户端验证的额外好处。请参阅您链接中的 Matt Johnson 的评论。我也可以证明它对我们有用。 @AaronHudon @SteveGreene 重要的是你有[Column(TypeName = "char")][Column(TypeName = "binary")]。如果没有明确指定,EF 将默认为可变长度类型。如果类型被指定为固定长度类型,那么它将使用MaxLength() StringLength() 作为固定长度。所以你们俩都是对的。

以上是关于实体框架代码优先 MaxLength 和 FixedLegth(char 与 varchar)的主要内容,如果未能解决你的问题,请参考以下文章

实体框架、代码优先和全文搜索

实体框架代码优先和搜索标准

实体框架代码优先开发资源和文档

实体框架4.1代码优先映射问题

实体框架代码优先和 ASP.NET 成员资格

实体框架代码优先:共享主键