Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF代码首4.1不';根本不支持nvarchar(最大值)?_Entity Framework_Orm_Ef Code First_Entity Framework 4.1 - Fatal编程技术网

Entity framework EF代码首4.1不';根本不支持nvarchar(最大值)?

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

我在这个问题上花了相当多的时间,但仍然不明白为什么EF团队首先使用代码让生活变得如此艰难

下面是一些示例:

我的POCO:

我希望事情看起来像:

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)");
}