protected override Expression VisitReferencesColumn(SqlReferencesColumnExpression referencesColumnExpression) { this.Write("REFERENCES "); this.Visit(referencesColumnExpression.ReferencedTable); this.Write("("); this.WriteDeliminatedListOfItems(referencesColumnExpression.ReferencedColumnNames, this.WriteQuotedIdentifier); this.Write(")"); if (referencesColumnExpression.OnDeleteAction != SqlColumnReferenceAction.NoAction) { this.Write(" ON DELETE "); this.Write(referencesColumnExpression.OnDeleteAction); } if (referencesColumnExpression.OnUpdateAction != SqlColumnReferenceAction.NoAction) { this.Write(" ON UPDATE "); this.Write(referencesColumnExpression.OnUpdateAction); } if (this.sqlDialect.SupportsFeature(SqlFeature.Deferrability)) { this.WriteDeferrability(referencesColumnExpression.Deferrability); } return(referencesColumnExpression); }
protected override Expression VisitReferencesColumn(SqlReferencesColumnExpression referencesColumnExpression) { if (referencesColumnExpression.Deferrability != SqlColumnReferenceDeferrability.NotDeferrable) { return(new SqlReferencesColumnExpression(referencesColumnExpression.ReferencedTable, SqlColumnReferenceDeferrability.NotDeferrable, referencesColumnExpression.ReferencedColumnNames, referencesColumnExpression.OnDeleteAction, referencesColumnExpression.OnUpdateAction)); } return(base.VisitReferencesColumn(referencesColumnExpression)); }
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.SupportsFeature(SqlFeature.InlineForeignKeys); var foreignObjectConstraintAttribute = referencingProperty.ForeignObjectConstraintAttribute; foreach (var foreignKeyColumn in columnInfos) { var retval = this.BuildColumnDefinition(foreignKeyColumn); if (columnInfos.Length == 1 && supportsInlineForeignKeys) { var names = new[] { foreignKeyColumn.DefinitionProperty.PersistedName }; var newConstraints = new List <Expression>(retval.ConstraintExpressions); var referencesColumnExpression = new SqlReferencesColumnExpression ( new SqlTableExpression(referencedTableName), SqlColumnReferenceDeferrability.InitiallyDeferred, names, FixAction((foreignObjectConstraintAttribute != null && ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction) != null) ? ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction).Value : (valueRequired ? SqlColumnReferenceAction.Restrict : SqlColumnReferenceAction.SetNull)), FixAction((foreignObjectConstraintAttribute != null && ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction) != null) ? ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnUpdateAction).Value : SqlColumnReferenceAction.NoAction) ); newConstraints.Add(referencesColumnExpression); retval = new SqlColumnDefinitionExpression(retval.ColumnName, retval.ColumnType, newConstraints); } yield return(retval); } if (columnInfos.Length > 1 || !supportsInlineForeignKeys) { var currentTableColumnNames = columnInfos.Select(c => c.ColumnName); var referencedTableColumnNames = columnInfos.Select(c => c.GetTailColumnName()); var referencesColumnExpression = new SqlReferencesColumnExpression ( new SqlTableExpression(referencedTableName), SqlColumnReferenceDeferrability.InitiallyDeferred, referencedTableColumnNames, FixAction((foreignObjectConstraintAttribute != null && ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction) != null) ? ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction).Value : (valueRequired ? SqlColumnReferenceAction.Restrict : SqlColumnReferenceAction.SetNull)), FixAction((foreignObjectConstraintAttribute != null && ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnDeleteAction) != null) ? ToSqlColumnReferenceAction(foreignObjectConstraintAttribute.OnUpdateAction).Value : SqlColumnReferenceAction.NoAction) ); var foreignKeyConstraint = new SqlForeignKeyConstraintExpression(null, currentTableColumnNames, referencesColumnExpression); currentTableConstraints.Add(foreignKeyConstraint); } }
protected virtual Expression VisitReferencesColumn(SqlReferencesColumnExpression referencesColumnExpression) { return(referencesColumnExpression); }