2017-03-02 39 views
0

让我们假设我有一个对象,我想清除它的ID和所有导航属性。是可以通过分离?如果是这样,那么我如何在EF内核中执行此操作?EF核心 - 如何清除对象的ID及其导航属性

class Car 
{ 
    int Id {get;set;} 

    int CarTypeId {get;set;} 

    [ForeignKey(nameof(CarTypeId))] 
    CarType CarType{get;set;} 

    ... 
} 

回答

1

我最近做了这样的事情。正常的DbContext没有分离的方法,所以我添加了一个。

public void Detach<T>(T entity) 
    where T : class 
{ 
    Entry(entity).State = EntityState.Detached; 
} 

接下来我做了一个方法来分离和重置实体。我专门为一个实体做了,但概念是这样的。

public void DetachAndResetKeys(Car entity) 
{ 
    // Load references if needed 

    // Detach 
    _dbContext.Detach(entity); 
    // Reset Key. 0 equals not set for int key 
    entity.Id = 0; 

    entity.CarType = null; 
} 

更新:在分离时重置键。如果键可以是不同的类型,那么也需要处理它。这里只有int

public void Detach<T>(T entity) 
    where T : class 
{ 
    Entry(entity).State = EntityState.Detached; 
    foreach(var prop in Entry(entity).Properties) { 
     if (prop.Metadata.IsKey()) { 
      prop.CurrentValue = 0; 
     } 
    } 
} 
+0

我想知道detach能否自动清除所有id或不是。因为我需要在对象中自动清除所有的ID。 – Ellbar

+0

@Ellbar添加了一个重置​​密钥的分离版本。我没有测试它,但它应该工作。以同样的方式,你可以重置你的参考资料等。 – Mats391