2011-06-10 28 views
1

如果我想绑定两个实体框架对象person1person2与父子关系。说,对象来自不同的ObjectContexts或一个是分离的。好了,现在,我想编写类似:什么是EntityReference

person1.Parent = person2;

这失败的SaveChanges()。所以我写:

person1.ParentReference.EntityKey = person2.EntityKey;

这是该问题的一个正确的解决方案或每个人都应该重新加载“坏”对象(对象,它是目前在其它ObjectContext)?

+0

我不认为你应该直接设置参考,它可能会绕过一些跟踪的东西。请提供'SaveChanges'如何失败的详细信息? – 2011-06-10 06:52:57

回答

0

为了给你一个直接的答案

图片表格

[Tbl_Persons] 

PersonId int [PK] 
ParentId int [FK] 
FirstName nvarchar(100) 
LastName nvarchar(100) 
CreateUser int 
CreateDate datetime 
UpdateUser int 
UpdateDate datetime 

你将有2个选项来指定一个父

person1.Tbl_Persons = person2; 

其中PERSON1和PERSON2都是TblPersons对象,或只需指定Id

person1.ParentId = person2.PersonId; 

现在,完整代码因为我通常做插入/更新数据库

public class MyRepository : IMyRepository 
{ 
    MyEntities db = new MyEntities(); 
    DateTime now = DateTime.UTCNow; 

    public void Save() { 
     db.SaveChanges(); 
    } 

    #region Update/Insert Persons 

    public void UpdatePerson(Tbl_Persons person, int parentId, int userId) 
    { 
     // let's check if record is in db 
     Tbl_Persons p = this.GetPersonById(person.PersonId); 
     if(p == null) 
      p = new Person(); // person was not found in db 

     p.FirstName = person.FirstName; 
     p.LastName = person.LastName; 

     // we can now hook up the parent object in 2 ways 
     // or set the Id, or attach the hole object 
     // NOTE: only choose one line! 
     p.MyParent = parentId; 
     p.TblParent = this.GetPersonById(parentId); 

     // update info 
     p.UpdateDate = now; 
     p.UpdateUser = userId; 


     if(p.PersonId == 0) 
     { 
      // is it new person in db, so we need to INSERT into the db 
      p.CreateDate = now; 
      p.CreateUser = userId; 

      db.Tbl_Persons.AddObject(p); 
     } 
     else 
     { 
      // It's an existing person, we do need need to do anything 
      // as internally once we assign a new value to the object that 
      // come back from the database, EF sets Modified flag on this 
     } 

     // let's save 
     this.Save(); 
    } 

    #endregion 

    #region Queries 

     public Tbl_Persons GetPersonById(int personId) 
     { 
      return db.Tbl_Persons.FirstOrDefault(x => x.PersonId == personId); 
     } 

    #endregion 

} 

控制器

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Tbl_Persons model, int parentId) 
{ 
    if(ModelState.IsValid) 
    { 
     db.UpdatePerson(model, parentId, currentUserId); 
    } 

    return RedirectToAction("Index"); 
} 

希望它有助于。