无法在SQL Server数据库中将西里尔符号正确插入NTEXT字段

时间:2014-11-23 19:37:58

标签: c# sql-server ajax entity-framework cyrillic

如何将西里尔符号插入我的数据库?

我有表Articles和带有CRUD操作的Web API控制器。

Articles { id: int, summary: nvarchar, text: ntext }

如果我使用t-sql插入数据,如

insert into Articles values (1, N'текст', N'еще много текста')

一切正常 - 数据库中的数据还可以 - 所有俄罗斯符号看起来都不错。

但是如果我使用带有问号的ajax字段“text”插入数据:'??? ????? ??????'

$.post("http://localhost:1000/api/articles", 
  {
    id: 1,
    summary: "текст",
    text: "еще много текста"
  }
).always(function(res) {console.log(res)} );

我的错误在哪里?

PS:connectionString如果需要:

<add name="DefaultConnection" connectionString="Data Source=xxx;Initial Catalog=yyy;User ID=zzz;Password=***;" providerName="System.Data.SqlClient"/>

PPS:我正在使用来自WebAPI的deafult自动生成的POST操作:

// POST: api/Articles
[ResponseType(typeof(Article))]
public IHttpActionResult PostArticle(Article article)
{
  if (!ModelState.IsValid)
  {
    return BadRequest(ModelState);
  }

  db.Articles.Add(article);
  db.SaveChanges();

  return CreatedAtRoute("DefaultApi", new { id = article.ArticleId }, article);
}

UPD:

[DataContract]
public class Article
{
  [DataMember]
  public int Id { get; set; }

  [DataMember]
  public string Summary { get; set; }

  [DataMember]
  [Column(TypeName = "ntext")]
  public string Text { get; set; }
}

1 个答案:

答案 0 :(得分:1)

问题是,当您想要使用EF Code First映射NTEXT列时,您必须非常明确:您必须非常明确,并将列配置为所需类型,但您还必须配置它使用Unicode。为此,您可以使用Fluent API配置,例如使用以下代码覆盖OnModelCreating()

modelBuilder
  .Entity<Aticle>()         // Choose the entity to configure
  .Property(c=> c.Text)     // Choose the property to configure
  .HasColumnType("NTEXT")   // Specify the DB type
  .IsUnicode(true);         // Specify Unicode (for EF internally generated params)

然而,难怪NTEXT存在问题。来自ntext, text, and image (Transact-SQL) docs:

  将来的Microsoft SQL Server版本中将删除

ntext 文本图像数据类型。 在新的开发工作中避免使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max),varchar(max)和varbinary(max)。