成员'X'被更改为与协会成员'Y'不一致

Blu*_*kMN 16 .net vb.net linq-to-sql

如果我按照以下步骤操作,则会出现此错误:

  1. 更改对象的属性Y(关联的实体属性)
  2. 尝试提交更改
  3. 此时,Y的值和X的值(底层键)不一致 - LINQ to SQL显然不会同步这些,直到调用GetChangeSet.
  4. 由于更新操作期间的某些业务逻辑或数据库级别约束而发生预期错误.
  5. 此时Y的值与X一致,因为调用了GetChangeSet.
  6. 将Y的值更改为Nothing(也称为null).
  7. 调用GetChangeSet.

最后一步发生错误,因为X的值和X的原始值(由GetOriginalEntityState返回)不同,新值与Y不一致?这是为什么?这是LINQ to SQL中的错误.必须是因为如果我在步骤5中将Y更改为另一个(非空)值,我看不到相同的行为.这是正确的方法吗?我可以看到几种方式:

  1. 发生错误时丢弃DataContext并保持UI原样.我不喜欢这个,因为那时乐观的共存货币变化冲突无法被发现.新上下文中没有填充UI时填充的原始值,因此如果UI中有任何过时的值,它们将导致数据库中的数据还原.
  2. 刷新datacontext(OverwriteCurrent)并保持UI原样.出于与#1相同的原因,我不喜欢这个.
  3. 刷新datacontext(OverwriteCurrent)并重新填充UI.我不喜欢这样,因为刚刚呈现给用户的错误消息不会向用户显示他们所犯的错误并允许他们更正错误.它还会丢弃用户可能进行的所有其他更改.
  4. 当错误发生时,显式检索Y的键,对应于X的原始值并重置Y,然后调用GetChangeSet重新同步X(X是只读的或私有的,所以我不能直接重置它).这似乎工作,但似乎是一个黑客,可能需要大量的代码来解决其他类似的错误.

有没有更好的解决方案.这是应该报道的吗?

Blu*_*kMN 0

看起来这个错误已在最新的 .NET 和/或 Visual Studio 2010 中修复。为 DBML 文件生成的代码现在包含更新基础外键值的代码,即使将关联属性设置为 null 时也是如此:

    [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Customer_Order", Storage="_Customer", ThisKey="fkCustomer", OtherKey="id", IsForeignKey=true)]
    public Customer Customer
    {
        get
        {
            return this._Customer.Entity;
        }
        set
        {
            Customer previousValue = this._Customer.Entity;
            if (((previousValue != value) 
                        || (this._Customer.HasLoadedOrAssignedValue == false)))
            {
                this.SendPropertyChanging();
                if ((previousValue != null))
                {
                    this._Customer.Entity = null;
                    previousValue.Orders.Remove(this);
                }
                this._Customer.Entity = value;
                if ((value != null))
                {
                    value.Orders.Add(this);
                    this._fkCustomer = value.id;
                }
                else
                {
                    this._fkCustomer = default(Nullable<int>);
                }
                this.SendPropertyChanged("Customer");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我认为this._fkCustomer = default(Nullable<int>);当我最初发布这个问题时,我正在测试的代码中一定不存在。因此,要么我的 DBML 设置错误,要么这个问题已得到解决。