UPDATE操作-由于对象当前状态,操作无效。

11

我有两个表,它们通过外键引用关联在一起,我们称之为RX和program。 我有一个方法尝试更改RX表中的程序ID,它是指向program表中程序ID字段的FKR。 每当我尝试这样做时,我会得到一个

"由于对象的当前状态,操作无效"

这个错误发生在以下代码处:

System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException(); 我在这里做错了什么?

下面是问题代码片段和数据库字段定义:

    public void ChangeProgram(int programId, DbDataContext dc)
    {
        //var programId = ddlPrograms.SelectedValue.ToInteger(0);
        if (programId > 0)
        {
            var referral = PrescriptionManager.GetReferral(dc, _view.RxID);
            if (referral != null && referral.AspnRx.ProgramID != programId)
            {
                try
                {
                    referral.ProgramID = dc.PROGRAMs.Single(p => p.ProgramID == programId).ToString().ToInteger(1);
                }
                catch (ForeignKeyReferenceAlreadyHasValueException exception)
                {
                    _view.ChangeProgramSuccess = false;
                }   

数据库字段定义:

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ProgramID", DbType="Int")]
    public System.Nullable<int> ProgramID
    {
        get
        {
            return this._ProgramID;
        }
        set
        {
            if ((this._ProgramID != value))
            {
                if (this._PROGRAM.HasLoadedOrAssignedValue)
                {
                    throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
                }
                this.OnProgramIDChanging(value);
                this.SendPropertyChanging();
                this._ProgramID = value;
                this.SendPropertyChanged("ProgramID");
                this.OnProgramIDChanged();
            }
        }
    }
1个回答

27

这是一个 LinqToSql 的问题,你正在做的事情在 EF 和其他 ORM 中可能可以正常工作。你需要将表示对象的属性设置为新对象,而不仅仅是更新映射到数据库外键字段的属性。

假设你有一个名为 Program 的属性,则应该这样做:

referral.Program = dc.PROGRAMs.Single(p => p.ProgramID == programId);

与主题无关,但是.ToString().ToInteger(1)看起来有点可疑,似乎您正在将整数转换为字符串,然后再转回整数。


正是我所需要的! - John Pasquet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接