C# 实体框架 - 长字符串没有被持久化为 NVARCHAR(MAX)

Phi*_*hil 1 c# entity-framework

我对 C# 很陌生,我正在开发一个小应用程序来测试实体框架上的代码优先方法。

我的应用程序有一个类 Download,其中包含以下属性:

[Key]
public int DownloadId { get; set; }
public string URL { get; set; }
public Boolean IsFinished { get; set; }
[Column(TypeName = "nvarchar(MAX)")]
public string Contents { get; set; }
Run Code Online (Sandbox Code Playgroud)

在我的 Main 方法中,我创建了一些对多个网页的 HTTP GET 请求,并使用 DbContext 将它们的响应插入到 Contents 列中:

//Persist the download first without contents, just the URL
context.Downloads.Add(d);
context.SaveChanges();


// Create request
request = WebRequest.Create(d.URL);
request.Method = "GET";

response = request.GetResponse();
dataStream = response.GetResponseStream();
reader = new StreamReader(dataStream);

responseFromServer = reader.ReadToEnd();

reader.Close();
dataStream.Close();
response.Close();

d.Contents = responseFromServer;
Console.WriteLine("d.Contents= " + d.Contents);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

它适用于大多数页面。每当页面稍大一点时(这意味着更长的字符串),内容为空。

我测试了字符串的内容(参见上面最后一行),我得到了网页的完整内容,这意味着问题正好在最后一行(contexto.SaveChanges())。换句话说, a 有一个相对较大的字符串,它应该被持久化到 NVARCHAR(MAX) 列,并且由于某种原因它没有被持久化。

有任何想法吗?

Phi*_*hil 5

我发现出了什么问题。如果 NVARCHAR(MAX) 列的长度超过 43679 字节,即使数据存在,Visual Studio 中的服务器资源管理器也不会显示该列的内容。

此外,下载发生在线程上下文中;当页面很大时,我在下载完成之前查询数据库,因此得到一个空答复。