将具有重复关系实体的反序列化实体附加到DbContext

时间:2018-08-02 06:29:26

标签: c# .net entity-framework entity-framework-6

我正在从XML反序列化实体,并尝试将它们附加到DBContext。如果没有非重复实体,则此方法工作正常。但是,如果实体重复,则失败。

我的Db上下文:

public class Context : DbContext, IDisposable {
    public Context() : base("name=DefaultConnection") { }
    public static Context Create() { return new Context(); }
    public override int SaveChanges() {
        var addedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Added);
        foreach (var entry in addedEntries) {
            var dbEntity = GetDbEntity(entry);
            if (dbEntity != null) {
                entry.State = EntityState.Modified;
            }
        }
        return base.SaveChanges();
    }

    private object GetDbEntity(DbEntityEntry entry) {
        var entityType = ObjectContext.GetObjectType(entry.Entity.GetType());
        using (var context = new Context()) {
            var dbset = context.Set(entityType);
            var entityId = (Guid)GetPropValue(entry.Entity, "Id");
            var found = dbset.Find(entityId);
            return found;
        }
    }
    public static object GetPropValue(object src, string propName) {
        return src.GetType().GetProperty(propName).GetValue(src, null);
    }

    public DbSet<PurchaseOrder> PurchaseOrders { get; set; }
}

数据模型:(每个模型都有一个Guid Id主键)

PurchaseOrders -> LineItem -> TrackingCategory

反序列化后,当我具有这种类型的对象结构时,就会出现问题:

PurchaseOrder1 -> LineItem1 -> TrackingCategory1
               -> LineItem2 -> TrackingCategory1

解串器已为TrackingCategory创建了两个单独的对象。有没有一种方法可以在SaveChanges()覆盖中检测到此问题,然后删除/忽略然后重复或合并它们。

0 个答案:

没有答案