我有一张桌子Menu
。主键是Id。它应该是自动增量。
所以我有代码:
import tkinter as tk
root = tk.Tk()
var = tk.StringVar()
label = tk.Label(root, textvariable=var)
menubutton = tk.Menubutton(root, text="Select an option",
borderwidth=1, relief="raised",
indicatoron=True)
menu = tk.Menu(menubutton, tearoff=False)
menubutton.configure(menu=menu)
menu.add_radiobutton(label="One", variable=var, value="One")
menu.add_radiobutton(label="Two", variable=var, value="Two")
menu.add_radiobutton(label="Three", variable=var, value="Three")
label.pack(side="bottom", fill="x")
menubutton.pack(side="top")
root.mainloop()
然后在控制器中,我想保存生成的对象。
CampaignLanguage
然而,我收到了错误。
{"存储更新,插入或删除语句影响了意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。"}
我不想更改我的CampaignService.Save方法。那么如何解决呢?
修改
public partial class CampaignLanguage
{
public CampaignLanguage()
{
this.CampaignLanguageQuestions = new HashSet<CampaignLanguageQuestion>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
编辑1
[HttpPost]
public ActionResult Save(int clientId, int campaignId)
{
var campaign = CampaignService.GetCampaignById(campaignId);
var campaignLanguage = campaign.CampaignLanguages.Where(x => x.CampaignId == campaignId).FirstOrDefault();
if (campaignLanguage != null)
{
campaignLanguage.WelcomeMessage = message;
CampaignService.Save(campaignLanguage);
}
else
{
campaignLanguage = new CampaignLanguage();
campaignLanguage.Id = 1;
CampaignService.Save(campaignLanguage);
}
return Redirect("/Campaign/Index/" + clientId);
}
答案 0 :(得分:0)
您应该调用Add
而不是Update
,因为这是您要插入数据存储的新实例。您的Save
方法应检查主(自动递增键)是否具有大于0的值,以查看它是否是新的。或者,您也可以查看它是否已附加。也没有必要调用Update
,将实体设置为状态被修改除了确保所有属性都将被写回数据库但DbContext实现对实体的更改跟踪以便这已经发生(除非你在一个独立的状态工作)。
public void Save(CampaignLanguage campaignLanguage)
{
if(campaignLanguage.Id == 0)
_campaignLanguageRepository.Add(campaignLanguage);
else
_campaignLanguageRepository.Update(campaignLanguage);
_unitOfWork.Commit();
}
旁注:类型DbContext
已实现工作单元模式,DbSet<T>
是存储库模式的实现。不应该有任何需要在EF周围添加另一个客户工作单元和存储库模式,您只是创建一个完整的抽象层,因为可读性问题以及以后当您想要执行更复杂的操作(例如加入)时会出现问题在查询中将多个表放在一起。
答案 1 :(得分:0)
不幸的是,您需要更改CampaignService.Save。您正在尝试更新不存在的campaignLanguage对象。
另一个问题是您正在尝试将密钥强制转换为Identity列。您不能在第一次将insert_identy设置为表格时执行此操作。
也许,您需要要求正确的CampaignService方法。