TryGetObjectByKey()不返回已添加状态的实体(EF 6)

时间:2013-11-18 15:46:08

标签: entity-framework

1。问题#1

我有POCO

    public class Product
{
    public string Id { get; set; }
    public string Name { get; set; }

    public ICollection<Version> Versions { get; set; }       
}

在我的DbContext中,我有func

 public void AttachUpdated<T>( T objectDetached) where T : class
    {
        var objContext = ((IObjectContextAdapter)this).ObjectContext;
        var objSet = objContext.CreateObjectSet<T>();
        var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, objectDetached);

        object original;
        if (objContext.TryGetObjectByKey(entityKey, out original))
            objContext.ApplyCurrentValues(entityKey.EntitySetName, objectDetached);
        else
            objContext.AddObject(entityKey.EntitySetName, objectDetached);}

所以我想在上下文中添加一些产品

var p1 = new Product(){Id =“1”,Name =“Product 1”;} var p2 = new Product(){Id =“1”,Name =“Product 1”;}

ctx.AttachUpdated(P1);

当我尝试添加相同的产品(与第一个产品具有相同的ID)时,TryGetObjectByKey()找不到已添加的产品。
ctx.AttachUpdated(P2);

因此我需要使用ctx.SaveChanges()或AccseptAllChanges()然后 ctx.AttachUpdated(p2)按预期工作。 我无法理解代码中的问题所在。

  1. Q#2

    var p1 = new Product(){Id =“1”,Name =“Product 1”};

            var v1 = new Version() { Number = "1.0", Type = "Release", ReleaseDate = "01/01/13" };
    
            p1.Versions = new List<Version>();
    
            p1.Versions.Add(v1);
    
            ctx.AttachUpdated(p1);
    
  2. 然后我看到v1是DbSet()的addet。但为什么?我怎么能防止这样的行为。我只需要添加产品而不是相关版本。

1 个答案:

答案 0 :(得分:0)

 public void AttachOrUpdate<T>(T entity) where T : class
    {
        var objContext = ((IObjectContextAdapter)context).ObjectContext;
        var objSet = objContext.CreateObjectSet<T>();
        var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, entity);

        var original = this.context.Set<T>().Find(entityKey.EntityKeyValues[0].Value);

        if (original != null)
        {
            this.context.Entry<T>(original).CurrentValues.SetValues(entity);                
        }
        else
            objContext.AddObject(entityKey.EntitySetName, entity);
    }