【只有在 EntityKey 属性的当前值为 null 时才能设置该属性】

Triumph 2011-04-24 09:27:47
实体框架,InfoItem 类对应数据库中的 Info 表,实体集名称为 Info,添加没问题,修改后保存时出错,出错信息为:只有在 EntityKey 属性的当前值为 null 时才能设置该属性。


具体如下:



...
Dim _item As InfoItem
Using db As New DBEntities
Dim id As Guid = Guid.Parse(Request.QueryString("id"))
_item = db.Info.First(Function(item) item.ID = id)
End Using
...

Save(_item)

...


Public Sub Save(item As InfoItem)
Using db As New DBEntities
_item.Title = "New Title"
db.Info.AddObject(_item)'执行到这一句时出错
db.SaveChanges()
End Using
End Sub



请教如何处理?
...全文
497 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Triumph 2011-04-25
  • 打赏
  • 举报
回复

自己搞定,呵,还是对实体框架不了解呀

Public Sub Save(item As InfoItem)
Using db As New DBEntities
If _item.ID = GUID.Empty Then 'ID为空则为新对象
_item.ID = Guid.NewGUID
db.Info.AddObject(_item)'添加对象
Else
db.Info.Attach(_item)'附加对象
db.ObjectStateManager.ChangeObjectState(_item, EntityState.Modified)'将对象状态设置为“已更改”(没有这一句就不会保存,因为 Attach 方法会将状态设置为 EntityState.Unchanged 即没有变动,当然就不会保存)
End If
db.SaveChanges()
End Using
End Sub



区别主要是添加对象和附加对象。添加对象只能添加 EntityKey 属性为 null 的对象,但当对象是从实体集中生成的话,其 EntityKey 属性是不为 Null 的,所以只能用 Attach 方法附加。附加后对对象所做的修改将被记录,可以被保存,附加前修改的就不会被保存,所以要在附加后更改实体状态。
子夜__ 2011-04-25
  • 打赏
  • 举报
回复
没有主键。

_item.ID=Guid.Parse(Request.QueryString("id"))
机器人 2011-04-24
  • 打赏
  • 举报
回复
你这样和 Update 主键一样。。。

new 一个 Info ,然后挨个赋值。然后添加。

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧