首先在Entity Framework数据库中生成并自动增加Id

时间:2017-08-16 16:48:05

标签: c# sql-server entity-framework

我有一张桌子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);
    }

2 个答案:

答案 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方法。