protected virtual void AddFluentToMethod(MethodBuilder methodBuilder, ITable table) { var tableNamespace = TableNamespace(table); var tableClassName = TableClassName(table); var tableFullClassName = TableClassFullName(table); var tableClass = GenerationContext.FindClass(tableClassName, tableNamespace); var fluentExpression = MultiLineLambdaExpression.Create() .Parameter(p => p.Name("entity")) .RawLine($"entity.{ToTableFluent(table)}"); //.RawLine($"entity.ToTable(\"{table.Name}\", \"{table.Schema}\")"); var pks = table.Columns.Where(t => t.IsPrimaryKey); var hasCompositeKey = pks.Count() > 1; ; if (hasCompositeKey) { var def = string.Join(", ", pks.Select(pk => { var pkProp = tableClass.FindByMeta <PropertyBuilder>(pk); return($"t.{pkProp.GetName()}"); })); fluentExpression.RawLine($"entity.HasKey(t => new {{ {def} }})"); } else { var pk = pks.First(); var pkProp = tableClass.FindByMeta <PropertyBuilder>(pk); fluentExpression.RawLine($"entity.HasKey(t => t.{pkProp.GetName()})"); } table.Indexes.ForEach(i => { if (!ShouldGenerateIndex(i)) { return; } var line = RawLineBuilder.Create(); string rightExpr; if (i.Columns.Count == 1) { var indexProp = tableClass.FindByMeta <PropertyBuilder>(i.Columns.First()); rightExpr = $"t.{indexProp.GetName()}"; } else { var cols = string.Join(", ", i.Columns.Select(t => $"t.{tableClass.FindByMeta<PropertyBuilder>(t).GetName()}")); rightExpr = $"new {{ {cols} }}"; } line.Append($"entity.HasIndex(t => {rightExpr})"); line.Append($"\n\t.HasName(\"{i.Name}\")"); if (i.IsUnique) { line.Append("\n\t.IsUnique()"); } OnBeforeIndexLineAdded(line, i); fluentExpression.Add(line); }); table.Columns.ForEach(c => { var columnProp = tableClass.FindByMeta <PropertyBuilder>(c); var line = RawLineBuilder.Create(); line.Append($"entity.Property(t => t.{columnProp.GetName()})"); line.Append($".HasColumnType(\"{FluentColumnType(c)}\")"); if (c.IsPrimaryKey) { if (c.IsAutoIncrement) { line.Append(".ValueGeneratedOnAdd()"); } else { line.Append(".ValueGeneratedNever()"); } } else if (!string.IsNullOrWhiteSpace(c.DefaultValue)) { line.Append($".HasDefaultValueSql(\"{c.DefaultValue}\")"); } if (!c.IsNullable) { line.Append(".IsRequired()"); } if (c.CharacterMaximumLength.HasValue && c.CharacterMaximumLength != -1) { line.Append($".HasMaxLength({c.CharacterMaximumLength})"); } if (DataTypeResolver.IsString(c) && !DataTypeResolver.IsUnicode(c)) { line.Append(".IsUnicode(false)"); } fluentExpression.Add(line); }); table.ForeignKeys.ForEach(fk => { if (!TablesToGenerate.Contains(fk.PrimaryKeyColumn.Table)) { return; } var fkProp = tableClass.FindByMeta <PropertyBuilder>(fk); var fkColumnProp = tableClass.FindByMeta <PropertyBuilder>(fk.ForeignKeyColumn); var fkTableNamespace = TableNamespace(fk.PrimaryKeyColumn.Table); var fkTableClassName = TableClassName(fk.PrimaryKeyColumn.Table); var fkTableClass = GenerationContext.FindClass(fkTableClassName, fkTableNamespace); var reverseProp = fkTableClass.FindByMeta <PropertyBuilder>(fk); var line = RawLineBuilder.Create(); line.Append($"entity.HasOne(t => t.{fkProp.GetName()})"); if (!fk.IsOneToOne()) { line.Append($"\n\t.WithMany(t => t.{reverseProp.GetName()})"); line.Append($"\n\t.HasForeignKey(t => t.{fkColumnProp.GetName()})"); } else { line.Append($"\n\t.WithOne(t => t.{reverseProp.GetName()})"); line.Append($"\n\t.HasForeignKey<{tableFullClassName}>(t => t.{fkColumnProp.GetName()})"); } if (IsCascade(fk.DeleteCascadeAction)) { line.Append("\n\t.OnDelete(DeleteBehavior.Delete)"); } else if (IsSetNull(fk.DeleteCascadeAction)) { line.Append("\n\t.OnDelete(DeleteBehavior.SetNull)"); } else { line.Append("\n\t.OnDelete(DeleteBehavior.ClientSetNull)"); } line.Append($"\n\t.HasConstraintName(\"{fk.Name}\")"); line.Comment("Foreign Key"); fluentExpression.Add(line); }); var modelFluentLine = $"modelBuilder.Entity<{tableFullClassName}>({fluentExpression.GenerateInline()})"; methodBuilder.Add(RawLineBuilder.Create(modelFluentLine)); methodBuilder.AddEmptyLine(); }