什么是EntityReference

时间:2011-06-10 06:32:10

标签: c# .net entity-framework

如果我想用父子关系绑定两个实体框架对象person1person2。比如说,对象来自不同的ObjectContexts或者一个是分离的。那么现在,我想写一些类似的东西:

person1.Parent = person2;

SaveChanges()失败。所以我写道:

person1.ParentReference.EntityKey = person2.EntityKey;

这是解决该问题的正确解决方案,还是应该总是重新加载“坏”对象(当前位于另一个ObjectContext的对象)?

1 个答案:

答案 0 :(得分: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");
}
希望它有所帮助。