gpt4 book ai didi

c# - 已尝试附加或添加不是新实体,可能是从另一个 DataContext 加载的

转载 作者:太空狗 更新时间:2023-10-29 23:08:19 26 4
gpt4 key购买 nike

我遇到了 NotSupportedException 问题,我得到:“已尝试附加或添加一个不是新的实体,可能是从另一个 DataContext 加载的。”

partial class SupplyOfert : Model
{
public SupplyOfert(int id = 0)
{
if (id > 0)
this.get(id);
}

public Supplier supplier
{
get
{
return this.Supplier;
}
set
{
this.Supplier = db.Suppliers.SingleOrDefault(s => s.id == value.id);
}
}

public override bool get(int id)
{
SupplyOfert so = (SupplyOfert)db.SupplyOferts.SingleOrDefault(s => s.id == id).Copy(this, "Supplies");
this._Supplies = so._Supplies;
so._Supplies.Clear();
if (this.id > 0)
{
db.Dispose();
db = new Database();
db.SupplyOferts.Attach(this); // here I'm getting the exception
return true;
}
else
return false;
}

public override void save()
{
if (this.id <= 0)
db.SupplyOferts.InsertOnSubmit(this);
db.SubmitChanges();
}

public override void remove()
{
if (this.id > 0)
{
db.SupplyOferts.DeleteOnSubmit(this);
db.SubmitChanges();
}
}
}

当我添加新记录时:

SupplyOfert ofert = new SupplyOfert();
ofert.price = 100;
ofert.publisher = "some publisher";
ofert.supplier = new Supplier(1);
ofert.title = "some title";
ofert.year = DateTime.Today;
ofert.save();

没关系,但是当我想更新记录时,使用:

SupplyOfert ofert = new SupplyOfert(2);
ofert.price = 220;
ofert.publisher = "new publisher";
ofert.save();

我收到“NotSupportedExceptionw 未处理”。

这是模型类:

public abstract class Model
{
protected Database db = new Database();

public Model(){}

~Model()
{
db.Dispose();
}

abstract public bool get(int id);
abstract public void save();
abstract public void remove();

}

复制方法如下:

public static class ObjectProperties
{
public static object Copy(this object source, object destination, string skip = "")
{
if (source != null)
{
foreach (var sourceProperty in source.GetType().GetProperties())
{
foreach (var destinationProperty in destination.GetType().GetProperties())
{
if (destinationProperty.Name == sourceProperty.Name && destinationProperty.Name != skip)
destinationProperty.GetSetMethod().Invoke(destination, new object[] { sourceProperty.GetGetMethod().Invoke(source, null) });
}
}
}
else
destination = null;
return source;
}
}

数据库类它只是:

public class Database : DataClasses1DataContext

我发现,这个问题与赋值有关:

this.supplier = so.supplier;

但我不知道为什么...

最佳答案

这里的问题看起来像是您正在为每个实体创建一个单独的上下文(模型实例化了一个新的 db 副本)。那么会发生什么:

  1. 您创建对象并且它在它所附加的实体中有一个上下文对象
  2. 您使用自己的上下文类创建一个新对象并设置要更新的属性
  3. 它尝试保存并抛出实体已加载到另一个上下文(创建它的上下文)中的异常。

纠正这个问题的第一步是不要在实体内部创建新的上下文。

关于c# - 已尝试附加或添加不是新实体,可能是从另一个 DataContext 加载的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18549496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com