代码之家  ›  专栏  ›  技术社区  ›  Sako73

需要了解实体框架引用状态

  •  0
  • Sako73  · 技术社区  · 15 年前

    我是第一次实施实体框架。我正在处理添加/更新具有父属性的对象。

    我知道一个实体的父实体被初始化为“空”。我不完全理解如何使用父实体与父实体引用字段,或者需要什么来保存对实体的更改。

    1. 我在分析中是否遗漏了任何重要因素(即实体状态?)
    2. 以下哪种情况是可能的,以及
    3. 处理它们的最佳方法是什么:

    实体:空
    EntityReference:不为空

    实体:不为空
    EntityReference:空

    实体:不为空
    EntityReference:不为空

    谢谢你的帮助。

    代码示例:

    internal void AddUpdateObject(MyDataContext context)
    {
    // HOW DO I HANDLE THIS SECTION vvvv
    if (this.MyParentEntity == null)
    {
        throw new Exception("Parent Property Null.");
    }
    if (this.MyParentEntity.EntityState == EntityState.Detached)
    {
        MyParentEntity t = this.MyParentEntity;
        this.MyParentEntity = null;
        context.AttachTo("ParentCollection", t);
        this.MyParentEntity = t;
    }
    // ^^^^^^^^^
    try
    {
        context.AddToMyEntities(this);
    }
    catch (InvalidOperationException)
    {
        // the object with the key already exists
        MyEntity ent = context.MyEntities.First(x => x.id == this.id);
        PropertyInfo[] props = typeof(MyEntity).GetProperties();
        foreach (PropertyInfo pi in props)
        {
            if (pi.CanRead && pi.CanWrite &&
                !pi.PropertyType.Name.StartsWith("EntityCollection") &&
                !pi.Name.Equals("id"))
                pi.SetValue(ent, pi.GetValue(this, null), null);
        }
    }
    }
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Craig Stuntz    15 年前

    你可以这样做:

    var entity = context.MyEntities.FirstOrDefault(x => x.id == this.id);
    if (entity != null)
    {
        // updating
        // HOW DO I HANDLE THIS SECTION vvvv
        if (!entity.MyParentEntityReference.IsLoaded)
        {
            entity.MyParentEntityReference.Load();
        }
    }
    else
    {
        // inserting
        entity = this;
        context.AddToMyEntities(this);
        this.ParentEntity = // whatever
    }
    entity.SomeOtherProperty = someValue;
    context.SaveChanges();
    

    那能回答你的问题吗?

        2
  •  0
  •   Sako73    15 年前

    这是有效的:

    MyEntity e = context.MyEntities.FirstOrDefault(x => x.id == this.id);
    if(e == null){
        MyParent p = this.Parent;
        this.Parent = null;
        context.Attach(p);
        this.Parent = p;
    }
    else
    {
        context.ApplyPropertyChanges("MyEntities", this);
    }
    

    一些参考链接:
    ApplyPropertyChanges
    Adding objects with references to other objects