private static DbRelationOperateBase AddRelation <TSource, TTarget>(this DbSet <TSource> dataSet, TSource source, LambdaExpression expression, TTarget target) where TSource : class where TTarget : class { var propertyInfo = expression.GetMember(); var configure = dataSet.Context.Configuration; var table = configure.Metadata.Table(typeof(TSource)); var navigate = table.Navigates[propertyInfo]; DbObjectsOperateBase dependentInsert = null; DbObjectsOperateBase dependentInsert2 = null; var executor = dataSet.Context.Executor; if (!navigate.IsComposite) { DbObjectsOperateBase currentInsert = null; if (navigate.IsForeign == true) { currentInsert = GetInsertOperate <TSource>(source, executor); dependentInsert = GetInsertOperate <TTarget>(target, executor); } else { currentInsert = GetInsertOperate <TTarget>(target, executor); dependentInsert = GetInsertOperate <TSource>(source, executor); } if (currentInsert != null) { var reference = (IInsertReferenceRelation)currentInsert; var relation = reference.Relations.FirstOrDefault(a => a.Navigate == navigate); if (relation == null) { relation = new DbAddRelationOperate <TSource>(dataSet.Context, propertyInfo, typeof(TSource), table, navigate); reference.Relations.Add(relation); } relation.Add(source, target); if (dependentInsert != null) { currentInsert.Dependents.Add(dependentInsert); } return(relation); } } else { dependentInsert = GetInsertOperate <TSource>(source, executor); dependentInsert2 = GetInsertOperate <TTarget>(target, executor); } var result = GetOrCreate(dataSet, propertyInfo, new DbRelationItem(source, target) , (context, property) => new DbAddRelationOperate <TSource>(context, propertyInfo, typeof(TSource), table, navigate)); if (dependentInsert != null) { result.Dependents.Add(dependentInsert); } if (dependentInsert2 != null) { result.Dependents.Add(dependentInsert2); } return(result); }
/// <summary> /// 创建数据对象。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="operate">当前操作对象。</param> internal GenerateDataForCommit(GenerateContext context, DbObjectsOperateBase operate) : base(context, operate) { if (operate is IConcurrencyCheckOperate concur) { NeedConcurrencyCheck = concur.NeedCheck; } Table = context.Metadata.Table(operate.ClrType); TableCount = Table.InheritSets.Length + 1; Items = operate; Loader = CreateLoader(context, Table); CommitObject = new CommitObjectFragment(context, Loader); }
/// <summary> /// 创建提交内容对象。 /// </summary> /// <param name="context"></param> /// <param name="operate"></param> internal ContentBase(GenerateContext context, DbObjectsOperateBase operate) : base(context, operate) { if (operate is IConcurrencyCheckOperate concur) { NeedConcurrencyCheck = concur.NeedCheck; } Table = context.Metadata.Table(operate.ClrType); Items = operate; Items = operate; Loader = CreateLoader(context, Table); CommitObject = new CommitObjectFragment(context, Loader); }
/// <summary> /// 创建提交单元。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="operate">操作对象。</param> internal InheritContentUnitBase(GenerateContext context, DbObjectsOperateBase operate) : base(context, operate) { }
/// <summary> /// 创建内容对象。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="operate">操作对象。</param> internal UpdateContent(GenerateContext context, DbObjectsOperateBase operate) : base(context, operate) { }
/// <summary> /// 创建数据对象。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="operate">当前操作对象。</param> internal GenerateDataForUpdate(GenerateContext context, DbObjectsOperateBase operate) : base(context, operate) { }
/// <summary> /// 创建内容对象。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="operate">操作对象。</param> internal InheritDeleteContent(GenerateContext context, DbObjectsOperateBase operate) : base(context, operate) { Array.Reverse(Tables); }
/// <summary> /// 创建内容对象。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="operate">操作对象。</param> internal InheritInsertContent(GenerateContext context, DbObjectsOperateBase operate) : base(context, operate) { }