protected override Expression VisitReferences(SqlReferencesExpression expression) { if (expression.Deferrability != SqlColumnReferenceDeferrability.NotDeferrable) { return(expression.ChangeDeferrability(SqlColumnReferenceDeferrability.NotDeferrable)); } return(base.VisitReferences(expression)); }
protected virtual Expression VisitReferences(SqlReferencesExpression expression) { var table = (SqlTableExpression)Visit(expression.ReferencedTable); if (table != expression.ReferencedTable) { return(expression.ChangeReferencedTable(table)); } return(expression); }
private IEnumerable <SqlColumnDefinitionExpression> BuildForeignKeyColumnDefinitions(PropertyDescriptor referencingProperty, ColumnInfo[] columnInfos) { var relatedPropertyTypeDescriptor = this.model.GetTypeDescriptor(referencingProperty.PropertyType); var referencedTableName = relatedPropertyTypeDescriptor.PersistedName; var valueRequired = (referencingProperty.ValueRequiredAttribute != null && referencingProperty.ValueRequiredAttribute.Required) || referencingProperty.IsPrimaryKey; var supportsInlineForeignKeys = this.sqlDialect.SupportsCapability(SqlCapability.InlineForeignKeys); var foreignObjectConstraintAttribute = referencingProperty.ForeignObjectConstraintAttribute; foreach (var foreignKeyColumn in columnInfos) { var retval = this.BuildColumnDefinition(foreignKeyColumn); if (columnInfos.Length == 1 && supportsInlineForeignKeys && !(referencingProperty.ForeignObjectConstraintAttribute?.Disabled ?? false)) { var names = new[] { foreignKeyColumn.DefinitionProperty.PersistedName }; var newConstraints = new List <SqlConstraintExpression>(retval.ConstraintExpressions); var referencesColumnExpression = new SqlReferencesExpression ( new SqlTableExpression(referencedTableName), SqlColumnReferenceDeferrability.InitiallyDeferred, names, this.FixAction(foreignObjectConstraintAttribute != null && this.ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction) != null ? this.ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction).Value : (valueRequired ? SqlColumnReferenceAction.Restrict : SqlColumnReferenceAction.SetNull)), this.FixAction((foreignObjectConstraintAttribute != null && this.ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction) != null) ? this.ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnUpdateAction).Value : SqlColumnReferenceAction.NoAction) ); newConstraints.Add(new SqlConstraintExpression(referencesColumnExpression, this.formatterManager.GetForeignKeyConstraintName(referencingProperty))); retval = new SqlColumnDefinitionExpression(retval.ColumnName, retval.ColumnType, newConstraints); } yield return(retval); } if ((columnInfos.Length > 1 || !supportsInlineForeignKeys) && !(referencingProperty.ForeignObjectConstraintAttribute?.Disabled ?? false)) { var currentTableColumnNames = columnInfos.Select(c => c.ColumnName).ToList(); var referencedTableColumnNames = columnInfos.Select(c => c.GetTailColumnName()); var referencesExpression = new SqlReferencesExpression ( new SqlTableExpression(referencedTableName), SqlColumnReferenceDeferrability.InitiallyDeferred, referencedTableColumnNames, this.FixAction((foreignObjectConstraintAttribute != null && this.ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction) != null) ? this.ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction).Value : (valueRequired ? SqlColumnReferenceAction.Restrict : SqlColumnReferenceAction.SetNull)), this.FixAction((foreignObjectConstraintAttribute != null && this.ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction) != null) ? this.ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnUpdateAction).Value : SqlColumnReferenceAction.NoAction) ); var foreignKeyConstraint = new SqlConstraintExpression(referencesExpression, this.formatterManager.GetForeignKeyConstraintName(referencingProperty), currentTableColumnNames); this.currentTableConstraints.Add(foreignKeyConstraint); } }