public OverrideWriter(ClassBuilder classBuilder, DatabaseTable table, INamer namer) { _cb = classBuilder; _table = table; _namer = namer; NetName = table.NetName; }
public UnitTestWriter(DatabaseSchema schema, CodeWriterSettings codeWriterSettings) { _codeWriterSettings = codeWriterSettings; _schema = schema; _cb = new ClassBuilder(); }
//private CodeInserter _codeInserter; /// <summary> /// Initializes a new instance of the <see cref="ClassWriter"/> class. /// </summary> /// <param name="table">The table.</param> /// <param name="codeWriterSettings">The code writer settings.</param> public ClassWriter(DatabaseTable table, CodeWriterSettings codeWriterSettings) { _codeWriterSettings = codeWriterSettings; _table = table; _cb = new ClassBuilder(); //_codeInserter = codeWriterSettings.CodeInserter; //if (_codeInserter == null) _codeInserter = new CodeInserter(); }
public void TestRequiredWithErrorMessageFormat() { //arrange var settings = new CodeWriterSettings(); settings.RequiredErrorMessage = "{0} is mandatory"; var classBuilder = new ClassBuilder(); var column = new DatabaseColumn(); column.Name = column.NetName = "Important"; column.DataType = new DataType("NVARCHAR2", "System.String"); column.Nullable = false; var target = new DataAnnotationWriter(true, settings); //act target.Write(classBuilder, column); var result = classBuilder.ToString().Trim(); //ignore lines //assert Assert.AreEqual("[Required(ErrorMessage=\"Important is mandatory\")]", result); }
public void TestIndex() { //arrange var settings = new CodeWriterSettings(); settings.CodeTarget = CodeTarget.PocoEntityCodeFirst; settings.WriteCodeFirstIndexAttribute = true; var classBuilder = new ClassBuilder(); var table = new DatabaseTable { Name = "Test" }; var nameColumn = table.AddColumn<int>("Id").AddPrimaryKey() .AddColumn<string>("Name").AddNullable().AddIndex("IX_NAME"); var target = new DataAnnotationWriter(true, settings); //act target.Write(classBuilder, nameColumn); var result = classBuilder.ToString().Trim(); //ignore lines //assert Assert.AreEqual("[Index(\"IX_NAME\")]", result); }
public void TestDecimalRangeWithErrorMessage() { //arrange var settings = new CodeWriterSettings(); settings.RangeErrorMessage = "{1} must be less than {0}"; var classBuilder = new ClassBuilder(); var column = new DatabaseColumn(); column.Name = column.NetName = "Name"; column.DataType = new DataType("NUMBER", "System.Decimal"); column.Nullable = true; column.Precision = 5; column.Scale = 1; var target = new DataAnnotationWriter(true, settings); //act target.Write(classBuilder, column); var result = classBuilder.ToString().Trim(); //ignore lines //assert Assert.AreEqual("[Range(typeof(decimal), \"0\", \"9999\", ErrorMessage=\"Name must be less than 9999\")]", result); }
public Nester(ClassBuilder classBuilder) { _classBuilder = classBuilder; }
/// <summary> /// Write any table annotations. /// </summary> /// <param name="table">The table.</param> /// <param name="classBuilder">The class builder.</param> public virtual void WriteTableAnnotations(DatabaseTable table, ClassBuilder classBuilder) { // }
/// <summary> /// Write any namespaces. /// </summary> /// <param name="table">The table.</param> /// <param name="classBuilder">The class builder.</param> public virtual void WriteNamespaces(DatabaseTable table, ClassBuilder classBuilder) { // }
private void WriteRequiredAttribute(ClassBuilder cb) { var required = "[Required]"; var requiredErrorMessage = _codeWriterSettings.RequiredErrorMessage; if (!string.IsNullOrEmpty(requiredErrorMessage)) { required = "[Required(ErrorMessage=\"" + string.Format(CultureInfo.InvariantCulture, requiredErrorMessage, _friendlyName) + "\")]"; } cb.AppendLine(required); }
public void Write(ClassBuilder cb, DatabaseColumn column) { var netName = column.NetName ?? column.Name; //http://weblogs.asp.net/jgalloway/archive/2005/09/27/426087.aspx _friendlyName = Regex.Replace(netName, "([A-Z]+|[0-9]+)", " $1", RegexOptions.Compiled).Trim(); if (_isNet4) //Display is .Net 4 and Silverlight 3 only { WriteDisplayAttribute(cb, netName); } //we won't mark primary keys as required, because they may be assigned by a ORM primary key strategy or database identity/sequence if (column.IsPrimaryKey) { //.Net 4 and Silverlight 3 only //NOTE: for EF CodeFirst generation, we also mapped fluently. //Despite the duplication, it's useful to have the key as a marker in the model if (_isNet4) cb.AppendLine("[Key]"); } else if (!column.Nullable) WriteRequiredAttribute(cb); //foreign keys will not expose the underlying type if (column.IsForeignKey) return; if (column.IsIndexed && _codeWriterSettings.CodeTarget == CodeTarget.PocoEntityCodeFirst && _codeWriterSettings.WriteCodeFirstIndexAttribute && column.Table != null) { WriteIndex(cb, column); } var dt = column.DataType; if (dt == null) { //it is a database specific type } else if (dt.IsString) { //if it's over a million characters, no point validating if (column.Length < 1073741823 && column.Length > 0) WriteStringLengthAttribute(cb, column.Length); } else if (dt.IsInt) { var max = column.Precision.GetValueOrDefault() - column.Scale.GetValueOrDefault(); if (max > 0 && max < 10) { //int.MaxValue is 2,147,483,647 (precision 10), no need to range WriteIntegerRange(cb, max); } } else if (dt.GetNetType() == typeof(decimal)) { //[Range(typeof(decimal),"0", "999")] var max = column.Precision.GetValueOrDefault() - column.Scale.GetValueOrDefault(); if (max > 0 && max < 28) { WriteDecimalRange(cb, max); } } }
private void WriteDisplayAttribute(ClassBuilder cb, string name) { if (_friendlyName != name) { cb.AppendLine("[Display(Name=\"" + _friendlyName + "\")]"); } }
public void TestRangeWithErrorMessageFormat1() { //arrange var settings = new CodeWriterSettings(); settings.RangeErrorMessage = "Must be less than {0}"; var classBuilder = new ClassBuilder(); var column = new DatabaseColumn(); column.Name = column.NetName = "Name"; column.DataType = new DataType("INT", "System.Int32"); column.Nullable = true; column.Precision = 5; column.Scale = 0; var target = new DataAnnotationWriter(true, settings); //act target.Write(classBuilder, column); var result = classBuilder.ToString().Trim(); //ignore lines //assert Assert.AreEqual("[Range(0, 99999, ErrorMessage=\"Must be less than 99999\")]", result); }
/// <summary> /// Writes any column annotations. /// </summary> /// <param name="table">The table.</param> /// <param name="column">The column.</param> /// <param name="classBuilder">The class builder.</param> public virtual void WriteColumnAnnotations(DatabaseTable table, DatabaseColumn column, ClassBuilder classBuilder) { // }
/// <summary> /// Initializes a new instance of the <see cref="ClassWriter"/> class. /// </summary> /// <param name="table">The table.</param> /// <param name="codeWriterSettings">The code writer settings.</param> public ClassWriter(DatabaseTable table, CodeWriterSettings codeWriterSettings) { _codeWriterSettings = codeWriterSettings; _table = table; _cb = new ClassBuilder(); }
/// <summary> /// Writes any class members (custom fields, properties, methods). /// </summary> /// <param name="table">The table.</param> /// <param name="cb">The cb.</param> public virtual void WriteClassMembers(DatabaseTable table, ClassBuilder cb) { // }
public void Write(ClassBuilder cb, DatabaseColumn column) { var netName = column.NetName ?? column.Name; //http://weblogs.asp.net/jgalloway/archive/2005/09/27/426087.aspx _friendlyName = Regex.Replace(netName, "([A-Z]+|[0-9]+)", " $1", RegexOptions.Compiled).Trim(); if (_isNet4) //Display is .Net 4 and Silverlight 3 only { WriteDisplayAttribute(cb, netName); } //we won't mark primary keys as required, because they may be assigned by a ORM primary key strategy or database identity/sequence if (column.IsPrimaryKey) { //.Net 4 and Silverlight 3 only //NOTE: for EF CodeFirst generation, we also mapped fluently. //Despite the duplication, it's useful to have the key as a marker in the model if (_isNet4) { cb.AppendLine("[Key]"); } } else if (!column.Nullable) { WriteRequiredAttribute(cb); } //foreign keys will not expose the underlying type if (column.IsForeignKey) { return; } if (column.IsIndexed && _codeWriterSettings.CodeTarget == CodeTarget.PocoEntityCodeFirst && _codeWriterSettings.WriteCodeFirstIndexAttribute && column.Table != null) { WriteIndex(cb, column); } var dt = column.DataType; if (dt == null) { //it is a database specific type } else if (dt.IsString) { //if it's over a million characters, no point validating if (column.Length < 1073741823 && column.Length > 0) { WriteStringLengthAttribute(cb, column.Length); } } else if (dt.IsInt) { var max = column.Precision.GetValueOrDefault() - column.Scale.GetValueOrDefault(); if (max > 0 && max < 10) { //int.MaxValue is 2,147,483,647 (precision 10), no need to range WriteIntegerRange(cb, max); } } else if (dt.GetNetType() == typeof(decimal)) { //[Range(typeof(decimal),"0", "999")] var max = column.Precision.GetValueOrDefault() - column.Scale.GetValueOrDefault(); if (max > 0 && max < 28) { WriteDecimalRange(cb, max); } } }
public void TestIndexNotNeededForPrimaryKey() { //arrange var settings = new CodeWriterSettings(); settings.CodeTarget = CodeTarget.PocoEntityCodeFirst; settings.WriteCodeFirstIndexAttribute = true; var classBuilder = new ClassBuilder(); var table = new DatabaseTable { Name = "Test" }; table.AddColumn<int>("Id").AddPrimaryKey().AddIndex("PK_TEST") .AddColumn<string>("Category").AddNullable() .AddColumn<string>("Name").AddNullable().AddIndex("IX_NAME") ; var idColumn = table.PrimaryKeyColumn; var target = new DataAnnotationWriter(true, settings); //act target.Write(classBuilder, idColumn); var result = classBuilder.ToString().Trim(); //ignore lines //assert Assert.IsTrue(result.IndexOf("[Index", StringComparison.OrdinalIgnoreCase) == -1, "Should be just[Key]"); }
public override void WriteColumnAnnotations(DatabaseTable table, DatabaseColumn column, ClassBuilder classBuilder) { classBuilder.AppendFormat("[Column(\"{0}\")]", column.Name); }
public void TestStringLength() { //arrange var settings = new CodeWriterSettings(); settings.StringLengthErrorMessage = null; var classBuilder = new ClassBuilder(); var column = new DatabaseColumn(); column.Name = column.NetName = "Name"; column.DataType = new DataType("NVARCHAR2", "System.String"); column.Nullable = true; column.Length = 10; var target = new DataAnnotationWriter(true, settings); //act target.Write(classBuilder, column); var result = classBuilder.ToString().Trim(); //ignore lines //assert Assert.AreEqual("[StringLength(10)]", result); }
public override void WriteNamespaces(DatabaseTable table, ClassBuilder classBuilder) { classBuilder.AppendLine("using System.ComponentModel.DataAnnotations.Schema"); }
private void WriteIntegerRange(ClassBuilder cb, int max) { var maximum = new string('9', max); var range = string.Format(CultureInfo.InvariantCulture, "[Range(0, {0})]", maximum); var rangeErrorMessage = _codeWriterSettings.RangeErrorMessage; if (!string.IsNullOrEmpty(rangeErrorMessage)) { range = range.Replace(")]", ", ErrorMessage=\"" + string.Format(CultureInfo.InvariantCulture, rangeErrorMessage, maximum, _friendlyName) + "\")]"); } cb.AppendLine(range); }
public override void WriteTableAnnotations(DatabaseTable table, ClassBuilder classBuilder) { classBuilder.AppendFormat("[Table(\"{0}\")]", table.Name); }
private void WriteStringLengthAttribute(ClassBuilder cb, int? length) { var stringLength = string.Format(CultureInfo.InvariantCulture, "[StringLength({0})]", length); var lengthErrorMessage = _codeWriterSettings.StringLengthErrorMessage; if (!string.IsNullOrEmpty(lengthErrorMessage)) { stringLength = stringLength.Replace(")]", ", ErrorMessage=\"" + string.Format(CultureInfo.InvariantCulture, lengthErrorMessage, length, _friendlyName) + "\")]"); } cb.AppendLine(stringLength); }
private static void WriteIndex(ClassBuilder cb, DatabaseColumn column) { //EF 6.1 [Index] var table = column.Table; //find all the indexes that contain this column var indexes = table.Indexes.FindAll(x => x.Columns.Contains(column)); var pk = table.PrimaryKey; foreach (var index in indexes) { if (pk != null && pk.Columns.SequenceEqual(index.Columns.Select(c => c.Name))) { //this is the primary key index continue; } var sb = new StringBuilder(); sb.Append("[Index(\"" + index.Name + "\""); var multiColumn = index.Columns.Count > 1; if (multiColumn) { var position = index.Columns.FindIndex(x => Equals(x, column)) + 1; sb.Append(", " + position); } if (index.IsUnique) { //[Index("IdAndRating", 2, IsUnique = true)] sb.Append(", IsUnique = true"); } sb.Append(")]"); cb.AppendLine(sb.ToString()); } }