【问题标题】:UPDATE operation - Operation is not valid due to the current state of the objectUPDATE 操作 - 由于对象的当前状态,操作无效
【发布时间】:2019-07-28 15:27:29
【问题描述】:

我有两个通过外键引用链接的表,我们称它们为 RX 和 program。 我有这种方法试图更改 RX 表中的程序 id,这是程序表中程序 id 字段的 FKR。每当我尝试这样做时,我都会得到一个

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

哪个被触发:

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

有问题的代码 sn-p 和数据库字段定义如下。代码:

    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();
            }
        }
    }

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

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

    假设您有一个名为 Program 的属性,然后改为这样做:

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

    不是很相关,但是 .ToString().ToInteger(1),看起来有点可疑,看起来你正在取一个整数,将其转换为字符串,然后再转换回整数。

    【讨论】:

    • 正是我所需要的!
    猜你喜欢
    • 2010-10-18
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多