public OverrideWriter(ClassBuilder classBuilder, DatabaseTable table, INamer namer)
 {
     _cb = classBuilder;
     _table = table;
     _namer = namer;
     NetName = table.NetName;
 }
Esempio n. 2
0
 public UnitTestWriter(DatabaseSchema schema, CodeWriterSettings codeWriterSettings)
 {
     _codeWriterSettings = codeWriterSettings;
     _schema = schema;
     _cb = new ClassBuilder();
         
 }
Esempio n. 3
0
 //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);
        }
Esempio n. 7
0
 public Nester(ClassBuilder classBuilder)
 {
     _classBuilder = classBuilder;
 }
Esempio n. 8
0
 /// <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)
 {
     //
 }
Esempio n. 9
0
 /// <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)
 {
     //
 }
Esempio n. 10
0
 /// <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);
                }
            }
        }
Esempio n. 13
0
 /// <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)
 {
     //
 }
 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);
        }
Esempio n. 16
0
 /// <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)
 {
     //
 }
Esempio n. 17
0
 /// <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();
 }
Esempio n. 18
0
 /// <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)
 {
     //
 }
Esempio n. 19
0
        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);
 }
Esempio n. 27
0
 /// <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)
 {
     //
 }
        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());
            }
        }
Esempio n. 29
0
 /// <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)
 {
     //
 }