Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ObjectStateManager中已存在具有相同密钥的对象_C#_Entity Framework - Fatal编程技术网

C# ObjectStateManager中已存在具有相同密钥的对象

C# ObjectStateManager中已存在具有相同密钥的对象,c#,entity-framework,C#,Entity Framework,我有一个无法找到解决方案的场景,需要一些帮助 我怎样才能做到这一点,, 我希望获得客户端的当前记录,并对其进行修改,而不是更新,我希望将新记录添加到表中以获取历史更改信息 client c = new client(); using (DBEntities db = new DBEntities()) { // get current records in the client table for client IQueryable<

我有一个无法找到解决方案的场景,需要一些帮助 我怎样才能做到这一点,, 我希望获得客户端的当前记录,并对其进行修改,而不是更新,我希望将新记录添加到表中以获取历史更改信息

    client c = new client();
    using (DBEntities db = new DBEntities())
    {
        // get current records in the client table for client
        IQueryable<client> co = from p in db.client where p.CUS_NUMBER == scd.cus_number && p.isCurrent == true select p;

        c = co.First();

        //update email and and address
        c.EMAIL = Helper.CleanInput("mymail@mm.com");
        c.ADDRESS = Helper.CleanInput("123 Sheppard");

        //instead of updating current record I'd like to add new record to the table to keep historical changes
        db.AddToclient(c);
        db.SaveChanges();
        //I get error that 
        //An object with the same key already exists in the ObjectStateManager. 
        //The existing object is in the Modified state. An object can only be added to 
        //the ObjectStateManager again if it is in the added state.
client c=newclient();
使用(DBEntities db=new DBEntities())
{
//获取客户端的客户端表中的当前记录
IQueryable co=来自db.client中的p,其中p.CUS\u NUMBER==scd.CUS\u NUMBER&&p.isCurrent==true选择p;
c=公司优先();
//更新电子邮件和地址
c、 EMAIL=Helper.CleanInput(“mymail@mm.com");
c、 地址=Helper.CleanInput(“123 Sheppard”);
//我不想更新当前记录,而是想向表中添加新记录以保留历史更改
db.新增客户(c);
db.SaveChanges();
//我得到一个错误
//ObjectStateManager中已存在具有相同密钥的对象。
//现有对象处于修改状态。只能将对象添加到
//如果ObjectStateManager处于已添加状态,请重新启动它。
完全错误 ObjectStateManager中已存在具有相同键的对象。现有对象处于已修改状态。如果对象处于已添加状态,则只能将其再次添加到ObjectStateManager中


删除此代码
db.AddToclient(c);
,其余一切正常,您已经通过其引用访问该对象,因此无需再次添加它。调用
savechanges()


如果您想添加新对象
c=co.First().Clone();

请使用克隆删除此代码
db.AddToclient(c);
,其余一切正常,您已经通过其引用访问了对象,因此无需再次添加。调用
savechanges()


或者,如果要添加新对象,请使用克隆。首先().Clone();

原因是
db.AddToclient(c);
给出了错误,因为此对象可能位于数据库中,被对象上下文跟踪

完成您正试图做的事情的最佳方法如下:

var newClient = new client()
{
    EMAIL = Helper.CleanInput("mymail@mm.com"),
    ADDRESS = Helper.CleanInput("123 Sheppard"),
};

db.AddToclient(newClient);
db.SaveChanges();

db.AddToclient(c);
给出错误的原因是,该对象可能在数据库中,被对象上下文跟踪

完成您正试图做的事情的最佳方法如下:

var newClient = new client()
{
    EMAIL = Helper.CleanInput("mymail@mm.com"),
    ADDRESS = Helper.CleanInput("123 Sheppard"),
};

db.AddToclient(newClient);
db.SaveChanges();

看起来您正在将同一行添加到数据库中,并且由于再次添加具有相同主键的同一行而出现错误,DB将不允许这样做

尝试添加新行并创建另一个表,该表保留旧行的历史信息和作为外键的引用。您可以添加一个布尔字段,该字段保留有关删除的信息,以便删除

希望能有所帮助
谢谢

看起来您正在将同一行添加到数据库中,由于再次添加具有相同主键的同一行而出现错误,DB将不允许这样做

尝试添加新行并创建另一个表,该表保留旧行的历史信息和作为外键的引用。您可以添加一个布尔字段,该字段保留有关删除的信息,以便删除

希望能有所帮助
感谢Entity Framework中的

,默认情况下,从数据库中检索到的所有对象都由ObjectContext实例跟踪。Entity Framework在内部映射由其键跟踪的所有对象。这称为。这意味着每个键只有一个实体实例。因此,您无需再次调用Add,因为entity已在EF映射上。您只需调用SaveChanges来持久化修改的实体

就您而言,您是:

1-创建EF ObjectContext的新实例;
2-在LINQ查询中检索实体;
3-更改检索到的实体的属性值;
4-再次添加到ObjContext;//错误!
5-调用SaveChanges()


步骤4是不必要的,因为ObjectContext已经知道检索到的对象。

在Entity Framework中,默认情况下,从数据库检索到的所有对象都由ObjectContext实例跟踪。Entity Framework在内部映射由其键跟踪的所有对象。这称为。这意味着只有每个键一个实体的实例。因此,您不需要再次调用Add,因为实体已经在EF映射上。您只需要调用SaveChanges来持久化修改的实体

就您而言,您是:

1-创建EF ObjectContext的新实例;
2-在LINQ查询中检索实体;
3-更改检索到的实体的属性值;
4-再次添加到ObjContext;//错误!
5-调用SaveChanges()


步骤4不是必需的,因为ObjectContext已经知道检索到的对象。

技术上,错误是因为该对象已经被对象上下文跟踪,可能它还不在数据库中。例如,您创建了一个新实体,然后将其添加到对象上下文中。如果您再次尝试重新添加,将引发异常,甚至如果您没有调用savechanges来持久化实体。技术上,错误是因为对象上下文已经跟踪了该对象,可能它还不在数据库中。例如,您创建了一个新实体,然后将其添加到对象上下文中。如果您再次尝试重新添加该实体,即使您没有调用savechanges来持久化该实体,也会引发异常蒂蒂。