使用Entitty Framework重新附加实体“代码优先” [英] Re-attaching entities with Entitty Framework "code first"

查看:57
本文介绍了使用Entitty Framework重新附加实体“代码优先”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我正在使用实体框架"Code First"做法。映射本身工作正常,但我一直在搜索如何更新断开连接的实体,但我没有找到任何关于它的好信息。


假设域模型如下: / p>

 


  public   class 项目
{
public int Id { get ; set ;}
public string 名称{ get ; set ;}
public 列表<附件>附件{ get ; set ;}
}

public 附件
{
public int Id { get ; set ;}
public string 名称{ get ; set ;}
}

解决方案


可能会让你感到困惑的是Add&附加是递归的,这意味着附加项目将尝试并附加两个新附件(这将导致密钥冲突,因为它们都具有零的Id)。


最好的事情要做是添加根对象,然后遍历并将任何现有对象标记为Unchanged或Modified。在CTP4中,没有很好的方法将对象标记为已修改,因此我在下面包含了一些代码,显示了如何使用
底层ObjectContext执行此操作:

 
class 程序
{
< span style ="color:Blue;"> static void Main( string [ ] args)
{
项目项目;
使用 var context = new ProjectContext())
{
project = context.Projects.First();
}

project.Name = " ChangedName" ;
project.Attachments.Add( new Attachment(){Name = " attachment1" });
project.Attachments.Add( new Attachment(){Name = " attachment2" });


使用 var context = new ProjectContext())
{
//将所有内容添加到上下文
context.Projects.Add(project);

//将任何现有实体标记为未更改或已修改
//标记为未更改使用 - context.Projects.Attach(project);
context.MarkAsModified(project);

context.SaveChanges();
}
}
}

public class ProjectContext:DbContext
{
public DbSet< Project>项目{ get ; set ; }
public DbSet< Attachment>附件{ get ; set ; }

public void MarkAsModified(对象实体)
{
this .ObjectContext.ObjectStateManager.ChangeObjectState(entity,System.Data.EntityState 。改性);
}
}


Hi,

I'm using Entity Framework "Code First" approach. The mapping itself works fine, but I have been searching how to update a disconnected entity, but I don't find any good information about it.

Let's say the domain model is like:

 

public class Project
{
  public int Id {get; set;}
  public string Name {get; set;}
  public List<Attachment> Attachments {get; set;}
}

public class Attachment
{
  public int Id {get; set;}
  public string Name {get; set;}
}

解决方案

Hi,

What is probably catching you out is that Add & Attach are recursive, meaning that attaching project will try and attach the two new Attachments (which will result in a key conflict because they both have an Id of zero).

The best thing to do is to add the root object and then go through and mark any existing objects as Unchanged or Modified. In CTP4 there isn't a great way to mark an object as modified so I've included some code below that shows how to do this using the underlying ObjectContext:

class Program
{
  static void Main(string[] args)
  {
    Project project;
    using (var context = new ProjectContext())
    {
      project = context.Projects.First();
    }

    project.Name = "ChangedName";
    project.Attachments.Add(new Attachment() { Name = "attachment1" });
    project.Attachments.Add(new Attachment() { Name = "attachment2" });


    using (var context = new ProjectContext())
    {
      // Add everything to the context
      context.Projects.Add(project);

      // Mark any existing entities as Unchanged or Modified
      // To mark as unchanged use - context.Projects.Attach(project);
      context.MarkAsModified(project);

      context.SaveChanges();
    }
  }
}

public class ProjectContext : DbContext
{
  public DbSet<Project> Projects { get; set; }
  public DbSet<Attachment> Attachments { get; set; }

  public void MarkAsModified(object entity)
  {
    this.ObjectContext.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
  }
}


这篇关于使用Entitty Framework重新附加实体“代码优先”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆