Mercurial > pub > bltoolkit
comparison Source/Templates/BLToolkit.ttinclude @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 <#@ assembly name="System.Core" #> | |
| 2 <#@ assembly name="System.Data" #> | |
| 3 <#@ import namespace="System.Collections.Generic" #> | |
| 4 <#@ import namespace="System.Data" #> | |
| 5 <#@ import namespace="System.Linq" #> | |
| 6 <#@ import namespace="System.IO" #> | |
| 7 <# | |
| 8 AppDomain.CurrentDomain.AssemblyResolve += (_,args) => | |
| 9 { | |
| 10 foreach (var a in Assemblies) | |
| 11 if (args.Name.ToLower().IndexOf(a.Key.ToLower()) >= 0) | |
| 12 return System.Reflection.Assembly.LoadFile(a.Value); | |
| 13 | |
| 14 if (DataProviderAssembly != null && args.Name.Split(',')[0] == System.IO.Path.GetFileNameWithoutExtension(DataProviderAssembly)) | |
| 15 return System.Reflection.Assembly.LoadFile(DataProviderAssembly); | |
| 16 | |
| 17 return null; | |
| 18 }; | |
| 19 #><#+ | |
| 20 | |
| 21 static Dictionary<string,string> Assemblies = new Dictionary<string,string>(); | |
| 22 | |
| 23 static Action<GeneratedTextTransformation,string> WriteComment = (tt,s) => tt.WriteLine("//{0}", s); | |
| 24 static Action<GeneratedTextTransformation,string> WriteSummary = (tt,s) => | |
| 25 { | |
| 26 if (!string.IsNullOrWhiteSpace(s)) | |
| 27 { | |
| 28 tt.WriteLine("/// <summary>"); | |
| 29 tt.WriteLine("/// {0}", s); | |
| 30 tt.WriteLine("/// </summary>"); | |
| 31 } | |
| 32 }; | |
| 33 static Action<GeneratedTextTransformation,string> WriteUsing = (tt,s) => tt.WriteLine("using {0};", s); | |
| 34 static Action<GeneratedTextTransformation,string> WriteBeginNamespace = (tt,s) => { tt.WriteLine("namespace {0}", s); tt.WriteLine("{"); }; | |
| 35 static Action<GeneratedTextTransformation> WriteEndNamespace = tt => tt.WriteLine("}"); | |
| 36 static Action<GeneratedTextTransformation,string,string> WriteBeginClass = (tt,cl,bc) => | |
| 37 { | |
| 38 tt.Write("public partial class {0}", cl); | |
| 39 if (!string.IsNullOrEmpty(bc)) | |
| 40 tt.Write(" : {0}", bc); | |
| 41 tt.WriteLine(""); | |
| 42 tt.WriteLine("{"); | |
| 43 }; | |
| 44 static Action<GeneratedTextTransformation> WriteEndClass = tt => tt.WriteLine("}"); | |
| 45 static Func<string,string,string> MakeGenericType = (c,t) => string.Format("{0}<{1}>", c, t); | |
| 46 static Func<string,string> MakeType = t => t; | |
| 47 | |
| 48 delegate void WriteTablePropertyAction(GeneratedTextTransformation tt, string name, string pname, int maxlen, int maxplen, string desc); | |
| 49 | |
| 50 static WriteTablePropertyAction WriteTableProperty = (tt,name,pname,maxlen,maxplen,desc) => | |
| 51 { | |
| 52 WriteSummary(tt,desc); | |
| 53 tt.WriteLine("public Table<{0}>{1} {2}{3} {{ get {{ return this.GetTable<{0}>();{1} }} }}", name, tt.LenDiff(maxlen, name), pname, tt.LenDiff(maxplen, pname)); | |
| 54 }; | |
| 55 static Action<GeneratedTextTransformation,string> WriteAttribute = (tt,a) => tt.Write("[{0}]", a); | |
| 56 static Action<GeneratedTextTransformation> WriteAttributeLine = tt => tt.WriteLine(""); | |
| 57 | |
| 58 static string ConnectionString; | |
| 59 static string ConnectionType; | |
| 60 static string DataProviderAssembly = null; | |
| 61 | |
| 62 string DatabaseName = null; | |
| 63 string DataContextName = null; | |
| 64 string Namespace = "DataModel"; | |
| 65 string BaseDataContextClass = "DbManager"; | |
| 66 string BaseEntityClass = null; | |
| 67 string OneToManyAssociationType = "IEnumerable<{0}>"; | |
| 68 | |
| 69 string OwnerToInclude = null; | |
| 70 string[] DatabaseQuote = null; | |
| 71 | |
| 72 bool RenderField = false; | |
| 73 bool RenderBackReferences = true; | |
| 74 bool RenderForeignKeys = true; | |
| 75 | |
| 76 bool IsMetadataLoaded; | |
| 77 | |
| 78 int MaxColumnTypeLen; | |
| 79 int MaxColumnMemberLen; | |
| 80 | |
| 81 static Action<GeneratedTextTransformation,Column,int[],string[]> RenderColumn = (tt,c,maxLens,attrs) => | |
| 82 { | |
| 83 WriteSummary(tt,c.Description); | |
| 84 | |
| 85 if (maxLens.Sum() > 0) | |
| 86 { | |
| 87 if (attrs.Any(_ => _ != null)) | |
| 88 { | |
| 89 tt.Write("["); | |
| 90 | |
| 91 for (var i = 0; i < attrs.Length; i++) | |
| 92 { | |
| 93 if (attrs[i] != null) | |
| 94 { | |
| 95 tt.Write(attrs[i]); | |
| 96 tt.WriteSpace(maxLens[i] - attrs[i].Length); | |
| 97 | |
| 98 if (attrs.Skip(i + 1).Any(_ => _ != null)) | |
| 99 tt.Write(", "); | |
| 100 else if (maxLens.Skip(i + 1).Any(_ => _ > 0)) | |
| 101 tt.WriteSpace(2); | |
| 102 } | |
| 103 else if (maxLens[i] > 0) | |
| 104 { | |
| 105 tt.WriteSpace(maxLens[i]); | |
| 106 | |
| 107 if (maxLens.Skip(i + 1).Any(_ => _ > 0)) | |
| 108 tt.WriteSpace(2); | |
| 109 } | |
| 110 } | |
| 111 | |
| 112 tt.Write("] "); | |
| 113 } | |
| 114 else | |
| 115 { | |
| 116 tt.WriteSpace(maxLens.Sum() + (maxLens.Where(_ => _ > 0).Count() - 1) * 2 + 3); | |
| 117 } | |
| 118 } | |
| 119 | |
| 120 tt.Write("public {0}{1} {2}", c.Type, tt.LenDiff(tt.MaxColumnTypeLen, c.Type), c.MemberName); | |
| 121 | |
| 122 if (tt.RenderField) | |
| 123 { | |
| 124 tt.Write(";"); | |
| 125 if (c.ColumnType != null) | |
| 126 tt.Write(tt.LenDiff(tt.MaxColumnMemberLen, c.MemberName)); | |
| 127 } | |
| 128 else | |
| 129 tt.Write("{0} {{ get; set; }}", tt.LenDiff(tt.MaxColumnMemberLen, c.MemberName)); | |
| 130 | |
| 131 if (c.ColumnType != null) | |
| 132 { | |
| 133 tt.Write(" // {0}", c.ColumnType); | |
| 134 | |
| 135 if (c.Length != 0) | |
| 136 tt.Write("({0})", c.Length); | |
| 137 | |
| 138 if (c.Precision != 0) | |
| 139 { | |
| 140 if (c.Scale == 0) | |
| 141 tt.Write("({0})", c.Precision); | |
| 142 else | |
| 143 tt.Write("({0},{1})", c.Precision, c.Scale); | |
| 144 } | |
| 145 } | |
| 146 | |
| 147 tt.WriteLine(""); | |
| 148 }; | |
| 149 | |
| 150 static Action<GeneratedTextTransformation,ForeignKey> RenderForeignKey = (tt,key) => | |
| 151 { | |
| 152 WriteComment(tt, " " + key.KeyName); | |
| 153 tt.WriteLine("[Association(ThisKey=\"{0}\", OtherKey=\"{1}\", CanBeNull={2})]", | |
| 154 string.Join(", ", (from c in key.ThisColumns select c.MemberName).ToArray()), | |
| 155 string.Join(", ", (from c in key.OtherColumns select c.MemberName).ToArray()), | |
| 156 key.CanBeNull ? "true" : "false"); | |
| 157 | |
| 158 if (key.Attributes.Count > 0) | |
| 159 { | |
| 160 WriteAttribute(tt, string.Join(", ", key.Attributes.Distinct().ToArray())); | |
| 161 WriteAttributeLine(tt); | |
| 162 } | |
| 163 | |
| 164 tt.Write("public "); | |
| 165 | |
| 166 if (key.AssociationType == AssociationType.OneToMany) | |
| 167 tt.Write(tt.OneToManyAssociationType, key.OtherTable.ClassName); | |
| 168 else | |
| 169 tt.Write(key.OtherTable.ClassName); | |
| 170 | |
| 171 tt.Write(" "); | |
| 172 tt.Write(key.MemberName); | |
| 173 | |
| 174 if (tt.RenderField) | |
| 175 tt.WriteLine(";"); | |
| 176 else | |
| 177 tt.WriteLine(" { get; set; }"); | |
| 178 }; | |
| 179 | |
| 180 static Action<GeneratedTextTransformation,Table, bool> RenderTable = (tt,t, renderForeignKeys) => | |
| 181 { | |
| 182 WriteSummary(tt,t.Description); | |
| 183 | |
| 184 if (t.IsView) | |
| 185 { | |
| 186 WriteComment(tt, " View"); | |
| 187 } | |
| 188 | |
| 189 RenderTableAttributes(tt, t); | |
| 190 | |
| 191 WriteBeginClass(tt, t.ClassName, t.BaseClassName); | |
| 192 | |
| 193 tt.PushIndent("\t"); | |
| 194 | |
| 195 if (t.Columns.Count > 0) | |
| 196 { | |
| 197 tt.MaxColumnTypeLen = t.Columns.Values.Max(_ => _.Type.Length); | |
| 198 tt.MaxColumnMemberLen = t.Columns.Values.Max(_ => _.MemberName.Length); | |
| 199 | |
| 200 var maxLens = new int[] | |
| 201 { | |
| 202 t.Columns.Values.Max(_ => _.MemberName == _.ColumnName ? 0 : "MapField('')".Length + _.ColumnName.Length), | |
| 203 t.Columns.Values.Max(_ => _.IsNullable ? "Nullable".Length : _.IsIdentity ? "Identity".Length : 0), | |
| 204 t.Columns.Values.Max(_ => _.IsIdentity && _.IsNullable ? "Identity".Length : 0), | |
| 205 t.Columns.Values.Max(_ => _.IsPrimaryKey ? string.Format("PrimaryKey({0})", _.PKIndex).Length : 0), | |
| 206 t.Columns.Values.Max(_ => _.Attributes.Count == 0 ? 0 : string.Join(", ", _.Attributes.Distinct().ToArray()).Length), | |
| 207 }; | |
| 208 | |
| 209 foreach (var c in from c in t.Columns.Values orderby c.ID select c) | |
| 210 { | |
| 211 var attrs = new string[] | |
| 212 { | |
| 213 c.MemberName == c.ColumnName ? null : string.Format("MapField(\"{0}\")", c.ColumnName), | |
| 214 c.IsNullable ? "Nullable" : c.IsIdentity ? "Identity" : null, | |
| 215 c.IsIdentity && c.IsNullable ? "Identity" : null, | |
| 216 c.IsPrimaryKey ? string.Format("PrimaryKey({0})", c.PKIndex) : null, | |
| 217 c.Attributes.Count == 0 ? null : string.Join(", ", c.Attributes.Distinct().ToArray()), | |
| 218 }; | |
| 219 | |
| 220 RenderColumn(tt, c, maxLens, attrs); | |
| 221 } | |
| 222 } | |
| 223 | |
| 224 if (renderForeignKeys && t.ForeignKeys.Count > 0) | |
| 225 { | |
| 226 foreach (var key in t.ForeignKeys.Values.Where(k => tt.RenderBackReferences || k.BackReference != null)) | |
| 227 { | |
| 228 tt.WriteLine(""); | |
| 229 RenderForeignKey(tt, key); | |
| 230 } | |
| 231 } | |
| 232 | |
| 233 tt.PopIndent(); | |
| 234 WriteEndClass(tt); | |
| 235 }; | |
| 236 | |
| 237 static Action<GeneratedTextTransformation,Table> RenderTableAttributes = (tt,t) => | |
| 238 { | |
| 239 if (t.Attributes.Count > 0) | |
| 240 { | |
| 241 WriteAttribute(tt, string.Join(", ", t.Attributes.Distinct().ToArray())); | |
| 242 WriteAttributeLine(tt); | |
| 243 } | |
| 244 | |
| 245 string tbl = "TableName("; | |
| 246 | |
| 247 if (!string.IsNullOrEmpty(tt.DatabaseName)) | |
| 248 tbl += string.Format("Database=\"{0}\", ", tt.DatabaseName); | |
| 249 | |
| 250 if (!string.IsNullOrEmpty(t.Owner)) | |
| 251 tbl += string.Format("Owner=\"{0}\", ", t.Owner); | |
| 252 | |
| 253 tbl += string.Format("Name=\"{0}\")", t.TableName); | |
| 254 | |
| 255 WriteAttribute(tt, tbl); | |
| 256 WriteAttributeLine(tt); | |
| 257 }; | |
| 258 | |
| 259 List<string> Usings = new List<string>() | |
| 260 { | |
| 261 "System", | |
| 262 "BLToolkit.Data", | |
| 263 "BLToolkit.Data.Linq", | |
| 264 "BLToolkit.DataAccess", | |
| 265 "BLToolkit.Mapping", | |
| 266 }; | |
| 267 | |
| 268 static Action<GeneratedTextTransformation> RenderUsing = tt => | |
| 269 { | |
| 270 var q = | |
| 271 from ns in tt.Usings.Distinct() | |
| 272 group ns by ns.Split('.')[0]; | |
| 273 | |
| 274 var groups = | |
| 275 (from ns in q where ns.Key == "System" select ns).Concat | |
| 276 (from ns in q where ns.Key != "System" orderby ns.Key select ns); | |
| 277 | |
| 278 foreach (var gr in groups) | |
| 279 { | |
| 280 foreach (var ns in from s in gr orderby s select s) | |
| 281 WriteUsing(tt, ns); | |
| 282 | |
| 283 tt.WriteLine(""); | |
| 284 } | |
| 285 }; | |
| 286 | |
| 287 Action<GeneratedTextTransformation> BeforeGenerateModel = _ => {}; | |
| 288 Action<GeneratedTextTransformation> AfterGenerateModel = _ => {}; | |
| 289 | |
| 290 Action<GeneratedTextTransformation> BeforeWriteTableProperty = _ => {}; | |
| 291 Action<GeneratedTextTransformation> AfterWriteTableProperty = _ => {}; | |
| 292 | |
| 293 void GenerateModel() | |
| 294 { | |
| 295 if (ConnectionString != null) ConnectionString = ConnectionString.Trim(); | |
| 296 if (DataContextName != null) DataContextName = DataContextName. Trim(); | |
| 297 | |
| 298 if (string.IsNullOrEmpty(ConnectionString)) { Error("ConnectionString cannot be empty."); return; } | |
| 299 | |
| 300 if (string.IsNullOrEmpty(DataContextName)) | |
| 301 DataContextName = "DataContext"; | |
| 302 | |
| 303 LoadMetadata(); | |
| 304 | |
| 305 BeforeGenerateModel(this); | |
| 306 | |
| 307 WriteComment(this, "---------------------------------------------------------------------------------------------------"); | |
| 308 WriteComment(this, " <auto-generated>"); | |
| 309 WriteComment(this, " This code was generated by BLToolkit template for T4."); | |
| 310 WriteComment(this, " Changes to this file may cause incorrect behavior and will be lost if the code is regenerated."); | |
| 311 WriteComment(this, " </auto-generated>"); | |
| 312 WriteComment(this, "---------------------------------------------------------------------------------------------------"); | |
| 313 | |
| 314 RenderUsing(this); | |
| 315 | |
| 316 WriteBeginNamespace(this, Namespace); | |
| 317 PushIndent("\t"); | |
| 318 | |
| 319 WriteBeginClass(this, DataContextName, BaseDataContextClass); | |
| 320 | |
| 321 var tlist = (from t in Tables.Values orderby t.TableName select t).ToList(); | |
| 322 var maxlen = tlist.Max(_ => _.ClassName.Length); | |
| 323 var maxplen = tlist.Max(_ => (_.DataContextPropertyName ?? _.ClassName).Length); | |
| 324 | |
| 325 PushIndent("\t"); | |
| 326 | |
| 327 BeforeWriteTableProperty(this); | |
| 328 | |
| 329 foreach (var t in tlist) | |
| 330 WriteTableProperty(this, t.ClassName, t.DataContextPropertyName ?? t.ClassName, maxlen, maxplen, t.Description); | |
| 331 | |
| 332 AfterWriteTableProperty(this); | |
| 333 | |
| 334 PopIndent(); | |
| 335 | |
| 336 WriteEndClass(this); | |
| 337 | |
| 338 foreach (var t in tlist) | |
| 339 { | |
| 340 WriteLine(""); | |
| 341 RenderTable(this, t, RenderForeignKeys); | |
| 342 } | |
| 343 | |
| 344 PopIndent(); | |
| 345 WriteEndNamespace(this); | |
| 346 | |
| 347 AfterGenerateModel(this); | |
| 348 } | |
| 349 | |
| 350 string LenDiff(int max, string str) | |
| 351 { | |
| 352 var s = ""; | |
| 353 | |
| 354 while (max-- > str.Length) | |
| 355 s += " "; | |
| 356 | |
| 357 return s; | |
| 358 } | |
| 359 | |
| 360 void WriteSpace(int len) | |
| 361 { | |
| 362 while (len-- > 0) | |
| 363 Write(" "); | |
| 364 } | |
| 365 | |
| 366 List<T> CreateList<T>(T item) | |
| 367 { | |
| 368 return new List<T>(); | |
| 369 } | |
| 370 | |
| 371 Func<System.Data.IDbConnection> GetConnectionObject = () => | |
| 372 { | |
| 373 Type connType = null; | |
| 374 | |
| 375 if (DataProviderAssembly != null) | |
| 376 { | |
| 377 try | |
| 378 { | |
| 379 var assembly = System.Reflection.Assembly.LoadFile(DataProviderAssembly); | |
| 380 connType = assembly.GetType(ConnectionType) | |
| 381 ?? assembly.GetType(ConnectionType.Substring(0, ConnectionType.IndexOf(","))); | |
| 382 } | |
| 383 catch | |
| 384 { | |
| 385 } | |
| 386 } | |
| 387 | |
| 388 if (connType == null) | |
| 389 connType = Type.GetType(ConnectionType); | |
| 390 | |
| 391 return (System.Data.IDbConnection)Activator.CreateInstance(connType); | |
| 392 }; | |
| 393 | |
| 394 System.Data.IDbConnection GetConnection() | |
| 395 { | |
| 396 var conn = GetConnectionObject(); | |
| 397 | |
| 398 conn.ConnectionString = ConnectionString; | |
| 399 conn.Open(); | |
| 400 | |
| 401 return conn; | |
| 402 } | |
| 403 | |
| 404 void LoadMetadata() | |
| 405 { | |
| 406 if (IsMetadataLoaded) | |
| 407 return; | |
| 408 | |
| 409 IsMetadataLoaded = true; | |
| 410 | |
| 411 if (!string.IsNullOrEmpty(DataProviderAssembly) && !DataProviderAssembly.Contains(":") && DataProviderAssembly.Contains("..")) | |
| 412 { | |
| 413 try | |
| 414 { | |
| 415 string path = this.Host.ResolvePath(""); | |
| 416 DataProviderAssembly = Path.GetFullPath(Path.Combine(path, DataProviderAssembly)); | |
| 417 } | |
| 418 catch | |
| 419 { | |
| 420 } | |
| 421 } | |
| 422 | |
| 423 BeforeLoadMetadata(this); | |
| 424 LoadServerMetadata(); | |
| 425 | |
| 426 if (DatabaseQuote != null) | |
| 427 { | |
| 428 foreach (var t in Tables.Values) | |
| 429 { | |
| 430 t.TableName = string.Format("{1}{0}{2}", t.TableName, DatabaseQuote.FirstOrDefault(), DatabaseQuote.Skip(1).FirstOrDefault() ?? DatabaseQuote.FirstOrDefault()); | |
| 431 foreach (var c in t.Columns.Values) | |
| 432 { | |
| 433 c.ColumnName = string.Format("{1}{0}{2}", c.ColumnName, DatabaseQuote.FirstOrDefault(), DatabaseQuote.Skip(1).FirstOrDefault() ?? DatabaseQuote.FirstOrDefault()); | |
| 434 } | |
| 435 } | |
| 436 } | |
| 437 | |
| 438 foreach (var t in Tables.Values) | |
| 439 { | |
| 440 if (t.ClassName.Contains(" ")) | |
| 441 { | |
| 442 var ss = t.ClassName.Split(' ').Where(_ => _.Trim().Length > 0).Select(_ => char.ToUpper(_[0]) + _.Substring(1)); | |
| 443 t.ClassName = string.Join("", ss.ToArray()); | |
| 444 } | |
| 445 } | |
| 446 | |
| 447 foreach (var t in Tables.Values) | |
| 448 foreach (var key in t.ForeignKeys.Values.ToList()) | |
| 449 if (!key.KeyName.EndsWith("_BackReference")) | |
| 450 key.OtherTable.ForeignKeys.Add(key.KeyName + "_BackReference", key.BackReference = new ForeignKey | |
| 451 { | |
| 452 KeyName = key.KeyName + "_BackReference", | |
| 453 MemberName = key.MemberName + "_BackReference", | |
| 454 AssociationType = AssociationType.Auto, | |
| 455 OtherTable = t, | |
| 456 ThisColumns = key.OtherColumns, | |
| 457 OtherColumns = key.ThisColumns, | |
| 458 }); | |
| 459 | |
| 460 foreach (var t in Tables.Values) | |
| 461 { | |
| 462 foreach (var key in t.ForeignKeys.Values) | |
| 463 { | |
| 464 if (key.BackReference != null && key.AssociationType == AssociationType.Auto) | |
| 465 { | |
| 466 if (key.ThisColumns.All(_ => _.IsPrimaryKey)) | |
| 467 { | |
| 468 if (t.Columns.Values.Count(_ => _.IsPrimaryKey) == key.ThisColumns.Count) | |
| 469 key.AssociationType = AssociationType.OneToOne; | |
| 470 else | |
| 471 key.AssociationType = AssociationType.ManyToOne; | |
| 472 } | |
| 473 else | |
| 474 key.AssociationType = AssociationType.ManyToOne; | |
| 475 | |
| 476 key.CanBeNull = key.ThisColumns.All(_ => _.IsNullable); | |
| 477 } | |
| 478 } | |
| 479 } | |
| 480 | |
| 481 foreach (var t in Tables.Values) | |
| 482 { | |
| 483 foreach (var key in t.ForeignKeys.Values) | |
| 484 { | |
| 485 var name = key.MemberName; | |
| 486 | |
| 487 if (key.BackReference != null && key.ThisColumns.Count == 1 && key.ThisColumns[0].MemberName.ToLower().EndsWith("id")) | |
| 488 { | |
| 489 name = key.ThisColumns[0].MemberName; | |
| 490 name = name.Substring(0, name.Length - "id".Length); | |
| 491 | |
| 492 if (!t.ForeignKeys.Values.Select(_ => _.MemberName).Concat( | |
| 493 t.Columns. Values.Select(_ => _.MemberName)).Concat( | |
| 494 new[] { t.ClassName }).Any(_ => _ == name)) | |
| 495 { | |
| 496 name = key.MemberName;; | |
| 497 } | |
| 498 } | |
| 499 | |
| 500 if (name == key.MemberName) | |
| 501 { | |
| 502 if (name.StartsWith("FK_")) | |
| 503 name = name.Substring(3); | |
| 504 | |
| 505 if (name.EndsWith("_BackReference")) | |
| 506 name = name.Substring(0, name.Length - "_BackReference".Length); | |
| 507 | |
| 508 name = string.Join("", name.Split('_').Where(_ => _.Length > 0 && _ != t.TableName).ToArray()); | |
| 509 | |
| 510 if (name.Length > 0) | |
| 511 name = key.AssociationType == AssociationType.OneToMany ? PluralizeAssociationName(name) : SingularizeAssociationName(name); | |
| 512 } | |
| 513 | |
| 514 if (name.Length != 0 && | |
| 515 !t.ForeignKeys.Values.Select(_ => _.MemberName).Concat( | |
| 516 t.Columns. Values.Select(_ => _.MemberName)).Concat( | |
| 517 new[] { t.ClassName }).Any(_ => _ == name)) | |
| 518 { | |
| 519 key.MemberName = name; | |
| 520 } | |
| 521 } | |
| 522 } | |
| 523 | |
| 524 if (Tables.Values.SelectMany(_ => _.ForeignKeys.Values).Any(_ => _.AssociationType == AssociationType.OneToMany)) | |
| 525 Usings.Add("System.Collections.Generic"); | |
| 526 | |
| 527 var keyWords = new HashSet<string> | |
| 528 { | |
| 529 "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", | |
| 530 "class", "const", "continue", "decimal", "default", "delegate", "do", "double", "else", "enum", | |
| 531 "event", "explicit", "extern", "false", "finally", "fixed", "float", "for", "foreach", "goto", | |
| 532 "if", "implicit", "in", "int", "interface", "internal", "is", "lock", "long", "new", | |
| 533 "null", "object", "operator", "out", "override", "params", "private", "protected", "public", "readonly", | |
| 534 "ref", "return", "sbyte", "sealed", "short", "sizeof", "stackalloc", "static", "struct", "switch", | |
| 535 "this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", | |
| 536 "using", "virtual", "volatile", "void", "while" | |
| 537 }; | |
| 538 | |
| 539 foreach (var t in Tables.Values) | |
| 540 { | |
| 541 if (keyWords.Contains(t.ClassName)) | |
| 542 t.ClassName = "@" + t.ClassName; | |
| 543 | |
| 544 if (keyWords.Contains(t.DataContextPropertyName)) | |
| 545 t.DataContextPropertyName = "@" + t.DataContextPropertyName; | |
| 546 | |
| 547 foreach (var col in t.Columns.Values) | |
| 548 if (keyWords.Contains(col.MemberName)) | |
| 549 col.MemberName = "@" + col.MemberName; | |
| 550 } | |
| 551 | |
| 552 | |
| 553 AfterLoadMetadata(this); | |
| 554 } | |
| 555 | |
| 556 Func<string,string> PluralizeAssociationName = _ => _ + "s"; | |
| 557 Func<string,string> SingularizeAssociationName = _ => _; | |
| 558 | |
| 559 Action<GeneratedTextTransformation> BeforeLoadMetadata = _ => {}; | |
| 560 Action<GeneratedTextTransformation> AfterLoadMetadata = _ => {}; | |
| 561 | |
| 562 Dictionary<string,Table> Tables = new Dictionary<string,Table>(); | |
| 563 | |
| 564 public partial class Table | |
| 565 { | |
| 566 public string Owner; | |
| 567 public string TableName; | |
| 568 public string ClassName; | |
| 569 public string DataContextPropertyName; | |
| 570 public string BaseClassName; | |
| 571 public bool IsView; | |
| 572 public string Description; | |
| 573 public List<string> Attributes = new List<string>(); | |
| 574 | |
| 575 public Dictionary<string,Column> Columns = new Dictionary<string,Column>(); | |
| 576 public Dictionary<string,ForeignKey> ForeignKeys = new Dictionary<string,ForeignKey>(); | |
| 577 } | |
| 578 | |
| 579 public partial class Column | |
| 580 { | |
| 581 public int ID; | |
| 582 public string ColumnName; // Column name in database | |
| 583 public string MemberName; // Member name of the generated class | |
| 584 public bool IsNullable; | |
| 585 public bool IsIdentity; | |
| 586 public string Type; // Type of the generated member | |
| 587 public string ColumnType; // Type of the column in database | |
| 588 public bool IsClass; | |
| 589 public DbType DbType; | |
| 590 public SqlDbType SqlDbType; | |
| 591 public long Length; | |
| 592 public int Precision; | |
| 593 public int Scale; | |
| 594 public string Description; | |
| 595 | |
| 596 public int PKIndex = -1; | |
| 597 public List<string> Attributes = new List<string>(); | |
| 598 | |
| 599 public bool IsPrimaryKey { get { return PKIndex >= 0; } } | |
| 600 } | |
| 601 | |
| 602 public enum AssociationType | |
| 603 { | |
| 604 Auto, | |
| 605 OneToOne, | |
| 606 OneToMany, | |
| 607 ManyToOne, | |
| 608 } | |
| 609 | |
| 610 public partial class ForeignKey | |
| 611 { | |
| 612 public string KeyName; | |
| 613 public string MemberName; | |
| 614 public Table OtherTable; | |
| 615 public List<Column> ThisColumns = new List<Column>(); | |
| 616 public List<Column> OtherColumns = new List<Column>(); | |
| 617 public List<string> Attributes = new List<string>(); | |
| 618 public bool CanBeNull = true; | |
| 619 public ForeignKey BackReference; | |
| 620 | |
| 621 private AssociationType _associationType = AssociationType.Auto; | |
| 622 public AssociationType AssociationType | |
| 623 { | |
| 624 get { return _associationType; } | |
| 625 set | |
| 626 { | |
| 627 _associationType = value; | |
| 628 | |
| 629 if (BackReference != null) | |
| 630 { | |
| 631 switch (value) | |
| 632 { | |
| 633 case AssociationType.Auto : BackReference.AssociationType = AssociationType.Auto; break; | |
| 634 case AssociationType.OneToOne : BackReference.AssociationType = AssociationType.OneToOne; break; | |
| 635 case AssociationType.OneToMany : BackReference.AssociationType = AssociationType.ManyToOne; break; | |
| 636 case AssociationType.ManyToOne : BackReference.AssociationType = AssociationType.OneToMany; break; | |
| 637 } | |
| 638 } | |
| 639 } | |
| 640 } | |
| 641 } | |
| 642 | |
| 643 #> |
