我在EF7中有一个对象模型,如下所示:
Story -> StoryPhotos[]
我通过故事的表单提交来构建模型,其中用户还可以附加N个照片。模型创建看起来像这样:
var story = new Story
{
// ...
StoryPhotos = myFormData.Photos.Select(p => new StoryPhoto {
Name = p.Name,
FileName = p.FileName,
etc.
}).ToList()
}
然后,一旦我构建了数据模型,我就通过存储库保存数据。
await repository.AddOrUpdateStoryAsync(story)
看起来像这样
if (story.Id == 0)
{
context.Stories.Add(story);
context.StoryPhotos.AddRange(story.StoryPhotos);
}
else
{
// Update properties for an edit.
}
await context.SaveChangesAsync();
这很有效......只要我只有一个StoryPhoto。一旦我将多个放入数组中,我就会遇到这个异常:
An unhandled exception occurred while processing the request.
SqlException: Incorrect syntax near ','.
System.Data.SqlClient.SqlCommand.<>c__DisplayClass16.<ExecuteDbDataReaderAsync>b__17(Task`1 result)
我的研究表明,关于EF7如何保存对象图存在一些不同的问题,但我很困惑的情况是一个保存罚款,多个不保存,没有其他更改代码
我正在使用EntityFramework-SqlServer 7.0.0-beta7。
答案 0 :(得分:0)
嗯,这是答案。我还在ASP.NET 5实体框架GitHub上跟踪response to the issue(这不是问题)。对于任何碰到它的人都在这里重复。
好的,我可以直接在我的SQL数据库上重新创建问题。这是正在生成的查询。
messages.getMessages
我收到了这个错误:
INSERT INTO [StoryPhoto] ([FilePath], [StoryId])
OUTPUT INSERTED.[Id]
VALUES ('path1', '174'),
('path2', '174'),
('path3', '174');
另外,能够找到这个,我用Google搜索我原来的问题有点不同(当我第一次遇到这个问题时),发现this post on SO包含了这个答案:
为了使用多行VALUES(),()语法,您需要 运行SQL Server 2008(或更新版本)。
由于您运行的是SQL Server 2005,因此需要单独运行 插入语句,使用UNION / UNION ALL或升级实例 (它与Management Studio分开,后者只是一个客户端 用于连接到运行任意数量版本的实例的工具 SQL Server)。
所以,这是我在原帖中的怀疑。此特定应用程序仍在运行SQL Server 2005。
这使我找到了EntityFramework.MicrosoftSqlServer支持的数据库版本,这是2008及更高版本。