c# – 尝试附加或添加非新的实体,可能是从另一个DataContext加载的实体
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 尝试附加或添加非新的实体,可能是从另一个DataContext加载的实体,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2493字,纯文字阅读大概需要4分钟。
内容图文
![c# – 尝试附加或添加非新的实体,可能是从另一个DataContext加载的实体](/upload/InfoBanner/zyjiaocheng/817/b67270034e29419da7055d98c287c516.jpg)
我遇到了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未处理”.
这是Model类:
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;
但我不知道为什么……
解决方法:
这里的问题看起来像是在为每个实体创建一个单独的上下文(Model有一个db实例化的新副本).那么会发生什么:
>您创建对象,并且它在其所附加的实体中具有上下文对象
>使用自己的上下文类创建新对象,并设置要更新的属性
>它尝试保存并抛出实例已在另一个上下文中加载的异常 – 创建它的那个上下文.
纠正此问题的第一步是不在实体内创建新的上下文.
内容总结
以上是互联网集市为您收集整理的c# – 尝试附加或添加非新的实体,可能是从另一个DataContext加载的实体全部内容,希望文章能够帮你解决c# – 尝试附加或添加非新的实体,可能是从另一个DataContext加载的实体所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。