Files
2018-05-27 11:35:11 +08:00

258 lines
7.2 KiB
Plaintext

<%@ Template Language="C#" TargetLanguage="C#" Debug="True" Encoding="UTF-8" %>
<%@ Assembly Src="..\..\..\Common\Model.cs" %>
<%@ Assembly Src="..\..\..\Common\Extensions.cs" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Linq" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<%@ Import Namespace="SchemaMapper" %>
<%@ Property Name="Entity" Type="SchemaMapper.Entity" %>
<%@ Property Name="Namespace" Type="System.String" %>
<%-- Safe类名 --%>
<% string SafeClassName = Entity.ClassName.ToSafeName(); %>
<%-- 描述 --%>
<% string Description = Entity.Description; %>
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using <%= Entity.GetNamespace(Namespace,"Domain","Models") %>;
namespace <%=Namespace%>.Data.Mappings.<%= Entity.TableSchema %>.SqlServer {
/// <summary>
/// <%= Description %>映射配置
/// </summary>
public class <%= SafeClassName %>Map : Util.Datas.Ef.SqlServer.AggregateRootMap<<%= SafeClassName %>> {
/// <summary>
/// 映射表
/// </summary>
protected override void MapTable( EntityTypeBuilder<<%= SafeClassName %>> builder ) {
builder.ToTable( "<%= Entity.TableName %>", "<%= Entity.TableSchema %>" );
}
/// <summary>
/// 映射属性
/// </summary>
protected override void MapProperties( EntityTypeBuilder<<%= SafeClassName %>> builder ) {
<%
foreach(var p in Entity.Properties)
{
Response.Write(PropertyExpression(p));
}
%>
<%if(Entity.IsTreeEntity()){%>
builder.Property( t => t.Path ).HasColumnName( "Path" );
builder.Property( t => t.Level ).HasColumnName( "Level" );
<%}%>
}
}
}
<script runat="template">
public string PropertyExpression(Property property)
{
bool isString = property.SystemType == typeof(string);
bool isByteArray = property.SystemType == typeof(byte[]);
bool isDecimal = property.SystemType == typeof(Decimal);
if( property.ColumnName.ToLower() == "isdeleted" )
return " builder.HasQueryFilter( t => t.IsDeleted == false );\r\n";
if( property.IsKey == false )
return string.Empty;
if( property.ColumnName.ToLower() == "version" && isByteArray )
return string.Empty;
StringBuilder sb = new StringBuilder();
sb.AppendLine(" //" + property.Description);
sb.Append(' ', 3 * 4);
sb.Append("builder.Property(t => t.");
if( property.IsPrimaryKey.SafeValue() && property.IsForeignKey.SafeValue() == false )
sb.Append("Id");
else
sb.Append(property.PropertyName);
sb.Append(")");
sb.AppendLine();
sb.Append(' ', 4 * 4);
sb.Append(".HasColumnName(\"");
sb.Append(property.ColumnName);
sb.Append("\")");
if (property.IsIdentity == true)
{
sb.AppendLine();
sb.Append(' ', 4 * 4);
sb.Append(".HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)");
}
else if (property.IsAutoGenerated == true)
{
sb.AppendLine();
sb.Append(' ', 4 * 4);
sb.Append(".HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)");
}
sb.AppendLine(";");
return sb.ToString();
}
public string ManyToManyExpression(Relationship relationship)
{
StringBuilder sb = new StringBuilder();
// sb.AppendLine(" //" + Entity.GetOtherDescription(relationship.OtherEntity ));
//
// sb.Append(' ', 3 * 4);
// sb.Append("builder.HasMany(t => t.");
// sb.Append(relationship.ThisPropertyName);
// sb.Append(")");
//
// sb.AppendLine();
// sb.Append(' ', 4 * 4);
// sb.Append(".WithMany(t => t.");
// sb.Append(relationship.OtherPropertyName);
// sb.Append(")");
//
// sb.AppendLine();
// sb.Append(' ', 4 * 4);
// sb.Append(".Map(m =>");
// sb.AppendLine();
// sb.Append(' ', 4 * 4);
// sb.Append("{");
//
// sb.AppendLine();
// sb.Append(' ', 5 * 4);
// sb.Append("m.ToTable(\"");
// sb.Append(relationship.JoinTable);
// sb.Append("\", \"");
// sb.Append(relationship.JoinSchema);
// sb.Append("\");");
//
// sb.AppendLine();
// sb.Append(' ', 5 * 4);
// sb.Append("m.MapLeftKey(");
// sb.Append(relationship.JoinThisColumn.ToDelimitedString(", ", "\"{0}\""));
// sb.Append(");");
//
// sb.AppendLine();
// sb.Append(' ', 5 * 4);
// sb.Append("m.MapRightKey(");
// sb.Append(relationship.JoinOtherColumn.ToDelimitedString(", ", "\"{0}\""));
// sb.Append(");");
//
// sb.AppendLine();
// sb.Append(' ', 4 * 4);
// sb.Append("})");
//
// sb.Append(";");
// sb.AppendLine();
return sb.ToString();
}
public string RelationshipExpression(Relationship relationship)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(" //" + Entity.GetOtherDescription(relationship.OtherEntity ));
sb.Append(' ', 3 * 4);
if (relationship.ThisCardinality == Cardinality.One)
{
sb.Append("builder.HasOne(t => t.");
sb.Append(relationship.ThisPropertyName);
sb.Append(")");
}
else if (relationship.ThisCardinality == Cardinality.ZeroOrOne)
{
sb.Append("builder.HasOne(t => t.");
sb.Append(relationship.ThisPropertyName);
sb.Append(")");
}
if (relationship.OtherCardinality == Cardinality.Many)
{
sb.AppendLine();
sb.Append(' ', 4 * 4);
sb.Append(".WithMany(t => t.");
sb.Append(relationship.OtherPropertyName);
sb.Append(")");
sb.AppendLine();
sb.Append(' ', 4 * 4);
sb.Append(".HasForeignKey(d => ");
sb.Append(KeyExpression(relationship.ThisProperties, "d"));
sb.Append(")");
}
else
{
sb.AppendLine();
sb.Append(' ', 4 * 4);
sb.Append(".WithOptional(t => t.");
sb.Append(relationship.OtherPropertyName);
sb.Append(")");
}
sb.AppendLine(";");
return sb.ToString();
}
public string KeyExpression(IEnumerable<Property> keys, string alias = "t")
{
StringBuilder sb = new StringBuilder();
if (keys.Count() == 1)
{
sb.Append(alias);
sb.Append(".");
sb.Append("Id");
}
else
{
sb.Append("new { ");
foreach(var p in keys)
{
if (sb.Length > 6)
sb.Append(", ");
sb.Append(alias);
sb.Append(".");
if( p.IsForeignKey.SafeValue() == false )
sb.Append("Id");
else
sb.Append(p.PropertyName);
}
sb.Append(" }");
}
return sb.ToString();
}
public string KeyExpression(IEnumerable<string> keys, string alias = "t")
{
StringBuilder sb = new StringBuilder();
if (keys.Count() == 1)
{
sb.Append(alias);
sb.Append(".");
sb.Append(keys.FirstOrDefault());
}
else
{
sb.Append("new { ");
foreach(var p in keys)
{
if (sb.Length > 6)
sb.Append(", ");
sb.Append(alias);
sb.Append(".");
sb.Append(p);
}
sb.Append(" }");
}
return sb.ToString();
}
</script>