Entity framework EF代码首4.1不';根本不支持nvarchar(最大值)?
我在这个问题上花了相当多的时间,但仍然不明白为什么EF团队首先使用代码让生活变得如此艰难 下面是一些示例: 我的POCO: 我希望事情看起来像:Entity framework EF代码首4.1不';根本不支持nvarchar(最大值)?,entity-framework,orm,ef-code-first,entity-framework-4.1,Entity Framework,Orm,Ef Code First,Entity Framework 4.1,我在这个问题上花了相当多的时间,但仍然不明白为什么EF团队首先使用代码让生活变得如此艰难 下面是一些示例: 我的POCO: 我希望事情看起来像: public class Post { public int Id {get; set;} public string Text {get; set;} } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder
public class Post
{
public int Id {get; set;}
public string Text {get; set;}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(p => p.Text)
.HasColumnType("nvarchar(max)");
}
问题是,在第一种情况下,我尝试插入它提供给我的任何内容:对一个或多个实体的验证失败
,第二种情况不适合我的业务模型
我是唯一有这个问题的人吗?我该如何处理这件事?使用以下方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Post>()
.Property(p => p.Text)
.HasMaxLength(Int32.MaxValue);
}
当连接到SQL Server数据库时,使用
Int32.MaxValue
可能会导致一些问题。在属性或api中使用Int32.MaxValue
会引发异常,声明“不支持MaxLength大于4000的字符串列”。但是,在EF 4.1中,使用以下任一方法对我来说都很好:
您可以使用MaxLengtharitBute
,例如:
[MaxLength]
public string Text { get; set; }
或者像这样的fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(s => s.Text)
.IsMaxLength();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(s => s.Text)
.HasColumnType("ntext")
.IsMaxLength();
}
或者像这样的fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(s => s.Text)
.IsMaxLength();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(s => s.Text)
.HasColumnType("ntext")
.IsMaxLength();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(s=>s.Text)
.HasColumnType(“ntext”)
.IsMaxLength();
}
在这种情况下,您可能不需要MaxLength
属性
更新(2017年9月6日):
正如Sebazzz在其评论中指出的那样,SQL Server 2016中已经弃用了ntext
(和text
)。以下是进一步信息的链接:
如Andre Artus的帖子所述,使用没有任何值的[MaxLength]属性非常有效。在SQL CE下,它正确地使用“ntext”,而在SQL Server下,它使用“nvarchar(max)”。这是非常需要的,但应该在文档中更清楚地说明。我使用下面的代码为数据库中的字段获取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();
}
}
}
使用System.Data.Entity.ModelConfiguration;
使用Lansw.Panels.Domain.Entities;
名称空间Lansw.Panels.DataAccess.Configurations
{
内部类ServiceAgreementConfiguration:EntityTypeConfiguration
{
公共服务协议配置()
{
属性(t=>t.ServiceAgreementText).IsRequired().IsMaxLength();
}
}
}
我用这样的方法解决了我的问题:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Post>()
.Property(p => p.Text)
.IsMaxLength()
.HasColumnType("nvarchar(max)");
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.Property(p=>p.Text)
.IsMaxLength()
.HasColumnType(“nvarchar(max)”);
}
EF团队应该首先列出代码的“黑客”名单:)@Nazargol:他们会在代码发布时公布一份。但是,如果你想强制使用ntext
,他们会称之为“官方文档”,那么很容易应用[Column(TypeName=“ntext”)]
或。HasColumnType(“ntext”)
,就像我在最初的post.FYI中所做的那样-这在最终的EF4.1版本中被更改了。默认情况下,它使用nvarchar(max),而不使用[MaxLength]属性。应该是这样的。:)很高兴知道这一点。看来我得重新研究EF 4.1了。SQL CE 4+EF 4.1它使用的是nvarchar(4000)而不是ntext请注意ntext
已被弃用。不建议将其用于新的开发。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Post>()
.Property(p => p.Text)
.IsMaxLength()
.HasColumnType("nvarchar(max)");
}