C#实体框架 - 长字符串不作为NVARCHAR(MAX)保留

时间:2014-03-20 12:00:00

标签: c# entity-framework

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

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

[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; }

在我的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();

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我发现了什么问题。如果NVARCHAR(MAX)列的长度超过43679字节,则Visual Studio中的服务器资源管理器不会显示它们的竞争对手,即使数据存在也是如此。

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