答案 0 :(得分:38)
连接到SQL Server数据库时,使用Int32.MaxValue
可能会导致一些问题。在属性或api中使用Int32.MaxValue
会抛出异常,指出“不支持MaxLength大于4000的字符串列”。但是,在EF 4.1中使用以下任一方法都可以正常工作:
您可以使用MaxLengthArritbute
,例如
[MaxLength]
public string Text { get; set; }
或者流畅的API,如此
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(s => s.Text)
.IsMaxLength();
}
要强制使用ntext
,请使用以下其中一项:
[MaxLength]
[Column(TypeName = "ntext")]
public string Text { get; set; }
或者流畅的API,如此
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(s => s.Text)
.HasColumnType("ntext")
.IsMaxLength();
}
在这种情况下,您可能不需要MaxLength
属性。
更新(2017年9月6日):
正如Sebazzz在他的评论中所指出的ntext
(和text
)在SQL Server 2016中已被弃用。以下是更多信息的链接:
答案 1 :(得分:4)
使用此:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Post>()
.Property(p => p.Text)
.HasMaxLength(Int32.MaxValue);
}
或者这个:
[StringLength(Int32.MaxValue)]
public string Text { get; set; }
答案 2 :(得分:4)
使用没有任何值的[MaxLength]属性,如Andre Artus的帖子所述,效果非常好。在SQL CE下它正确使用“ntext”,而在SQL Server下它使用“nvarchar(max)”。这是非常需要的,但应该在文档中更清楚。
答案 3 :(得分:0)
我使用下面的代码获取数据库中字段的nvarchar(max)。我正在使用EF5。
using System.Data.Entity.ModelConfiguration;
using Lansw.Panels.Domain.Entities;
namespace Lansw.Panels.DataAccess.Configurations
{
internal class ServiceAgreementConfiguration : EntityTypeConfiguration<ServiceAgreement>
{
public ServiceAgreementConfiguration()
{
Property(t => t.ServiceAgreementText).IsRequired().IsMaxLength();
}
}
}
答案 4 :(得分:0)
我用这样的东西解决了我的问题:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Post>()
.Property(p => p.Text)
.IsMaxLength()
.HasColumnType("nvarchar(max)");
}