2.Visual Studio 2017 15.6 منتشر شد
These are the customer-reported issues addressed in this release:
- "Specified argument out of the range of valid values, parameter name: count"
git
tags. - Cannot open git commit details.
- VS2017 Installer crashes on Modify when SyncFusion WPF Templates are installed.
- Test Explorer loses position when tests are run.
- Test explorer test hierarchy constantly jumps to top.
- XAML editor always crashes when a change is made to the XAML file.
- Test Explorer keeps scrolling to the top when a new test starts.
- Viewing Git History shows: specified argument was out of range of values.
- Alt+Up/Down does not reposition file in .NET Framework projects.
- VS 15.6 deadlocks on solution load for .NET Core SDK project when a 'None Include' is added to file list.
- 15.6 preview 6 discovers test adapter, but fails to run tests.
- Test Explorer keeps scrolling to the top when a new test starts.
- Microsoft Security Advisories for .NET Core updates.
Microsoft Security Advisories for .NET Core
CVE-2018-0875: Microsoft is aware of a security vulnerability in the public versions of .NET Core where a malicious file or web request could cause a denial of service (DoS) attack.
- System administrators are advised to update their .NET Core runtimes to versions 1.0.10, 1.1.7 or 2.0.6. Developers are advised to update their .NET Core SDK to versions 1.1.8 or 2.1.101.
حجم تقریبی بروزرسانی از نسخه 15.6.1 به 15.6.2 برابر 1.2GB میباشد
کتاب C# Code Contracts Succinctly
Developed by Microsoft’s Research in Software Engineering, Code Contracts provide a way to convey code assumptions in your .NET applications. They can take the form of preconditions, postconditions, and state invariants. In C# Code Contracts Succinctly, author Dirk Strauss demonstrates how to use Code Contracts to validate logical correctness in code, how they can be integrated with abstract classes and interfaces, and even how they can be used to make writing documentation less painful.
نگاهی به Sketch Design
update products set Name = "Test" Where Id = 1
update products with (nolock,updlock) set Name = "Test" where Id = 1
public class UpdateRowLockHintDbCommandInterceptor : IDbCommandInterceptor { public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<Int32> interceptionContext) { if (command.CommandType != CommandType.Text) return; // (1) if (!(command is SqlCommand)) return; // (2) SqlCommand sqlCommand = (SqlCommand)command; String commandText = sqlCommand.CommandText; String updateCommandRegularExpression = "(update) "; Boolean isUpdateCommand = Regex.IsMatch(commandText, updateCommandRegularExpression, RegexOptions.IgnoreCase | RegexOptions.Multiline); // You may use better regular expression pattern here. if (isUpdateCommand) { Boolean isSnapshotIsolationTransaction = sqlCommand.Transaction != null && sqlCommand.Transaction.IsolationLevel == IsolationLevel.Snapshot; String tableHintToAdd = isSnapshotIsolationTransaction ? " with (rowlock , updlock) set " : " with (rowlock) set "; commandText = Regex.Replace(commandText, "^(set) ", (match) => { return tableHintToAdd; }, RegexOptions.IgnoreCase | RegexOptions.Multiline); command.CommandText = commandText; } }
5 Angular منتشر شد
We are pleased to announce version 5.0.0 of Angular, pentagonal-donut. This is a major release containing new features and bugfixes. This release continues our focus on making Angular smaller, faster, and easier to use.
بررسی دلایل انتخاب Angular
آغاز کار با git در ویژوال استدیو
In this episode, Robert is joined by Paul Litwin, who shows us how to get started with Git in under an hour. Git is a free, open source and quite popular distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Starting with the command line and ending up in both VS Code and Visual Studio, Paul takes us on a tour of the how you can use Git to manage your source code.
public class User { public int Id { get; set; } [Unique] public string Email { get; set; } [Unique("MyUniqueIndex",UniqueIndexOrder.ASC)] public string Username { get; set; } [Unique(UniqueIndexOrder.DESC)] public string PersonalCode{ get; set; } public string Password { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
using System; namespace SampleUniqueIndex { [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)] public class UniqueAttribute : Attribute { public UniqueAttribute(UniqueIndexOrder order = UniqueIndexOrder.ASC) { Order = order; } public UniqueAttribute(string indexName,UniqueIndexOrder order = UniqueIndexOrder.ASC) { IndexName = indexName; Order = order; } public string IndexName { get; private set; } public UniqueIndexOrder Order { get; set; } } public enum UniqueIndexOrder { ASC, DESC } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Metadata.Edm; using System.Linq; using System.Reflection; namespace SampleUniqueIndex { public static class DbContextExtention { private static BindingFlags PublicInstance = BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy; public static void ExecuteUniqueIndexes(this DbContext context) { var tables = GetTables(context); var query = ""; foreach (var dbSet in GetDbSets(context)) { var entityType = dbSet.PropertyType.GetGenericArguments().First(); var table = tables[entityType.Name]; var currentIndexes = GetCurrentUniqueIndexes(context, table.TableName); foreach (var uniqueProp in GetUniqueProperties(context, entityType, table)) { var indexName = string.IsNullOrWhiteSpace(uniqueProp.IndexName) ? "IX_Unique_" + uniqueProp.TableName + "_" + uniqueProp.FieldName : uniqueProp.IndexName; if (!currentIndexes.Contains(indexName)) { query += "ALTER TABLE [" + table.TableSchema + "].[" + table.TableName + "] ADD CONSTRAINT [" + indexName + "] UNIQUE ([" + uniqueProp.FieldName + "] " + uniqueProp.Order + "); "; } else { currentIndexes.Remove(indexName); } } foreach (var index in currentIndexes) { query += "ALTER TABLE [" + table.TableSchema + "].[" + table.TableName + "] DROP CONSTRAINT " + index + "; "; } } if (query.Length > 0) context.Database.ExecuteSqlCommand(query); } private static List<string> GetCurrentUniqueIndexes(DbContext context, string tableName) { var sql = "SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS where table_name = '" + tableName + "' and CONSTRAINT_TYPE = 'UNIQUE'"; var result = context.Database.SqlQuery<string>(sql).ToList(); return result; } private static IEnumerable<PropertyDescriptor> GetDbSets(DbContext context) { foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(context)) { var notMapped = prop.GetType().GetCustomAttributes(typeof(NotMappedAttribute),true); if (prop.PropertyType.Name == typeof(DbSet<>).Name && notMapped.Length == 0) yield return prop; } } private static List<UniqueProperty> GetUniqueProperties(DbContext context, Type entity, TableInfo tableInfo) { var indexedProperties = new List<UniqueProperty>(); var properties = entity.GetProperties(PublicInstance); var tableName = tableInfo.TableName; foreach (var prop in properties) { if (!prop.PropertyType.IsValueType && prop.PropertyType != typeof(string)) continue; UniqueAttribute[] uniqueAttributes = (UniqueAttribute[])prop.GetCustomAttributes(typeof(UniqueAttribute), true); NotMappedAttribute[] notMappedAttributes = (NotMappedAttribute[])prop.GetCustomAttributes(typeof(NotMappedAttribute), true); if (uniqueAttributes.Length > 0 && notMappedAttributes.Length == 0) { var fieldName = GetFieldName(context, entity, prop.Name); if (fieldName != null) { indexedProperties.Add(new UniqueProperty { TableName = tableName, IndexName = uniqueAttributes[0].IndexName, FieldName = fieldName, Order = uniqueAttributes[0].Order.ToString() }); } } } return indexedProperties; } private static Dictionary<string, TableInfo> GetTables(DbContext context) { var tablesInfo = new Dictionary<string, TableInfo>(); var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace; var tables = metadata.GetItemCollection(DataSpace.SSpace) .GetItems<EntityContainer>() .Single() .BaseEntitySets .OfType<EntitySet>() .Where(s => !s.MetadataProperties.Contains("Type") || s.MetadataProperties["Type"].ToString() == "Tables"); foreach (var table in tables) { var tableName = table.MetadataProperties.Contains("Table") && table.MetadataProperties["Table"].Value != null ? table.MetadataProperties["Table"].Value.ToString() : table.Name; var tableSchema = table.MetadataProperties["Schema"].Value.ToString(); tablesInfo.Add(table.Name, new TableInfo { EntityName = table.Name, TableName = tableName, TableSchema = tableSchema, }); } return tablesInfo; } public static string GetFieldName(DbContext context, Type entityModel, string propertyName) { var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace; var osMembers = metadata.GetItem<EntityType>(entityModel.FullName, DataSpace.OSpace).Properties; var ssMebers = metadata.GetItem<EntityType>("CodeFirstDatabaseSchema." + entityModel.Name, DataSpace.SSpace).Properties; if (!osMembers.Contains(propertyName)) return null; var index = osMembers.IndexOf(osMembers[propertyName]); return ssMebers[index].Name; } internal class UniqueProperty { public string TableName { get; set; } public string FieldName { get; set; } public string IndexName { get; set; } public string Order { get; set; } } internal class TableInfo { public string EntityName { get; set; } public string TableName { get; set; } public string TableSchema { get; set; } } } }
public static void ExecuteUniqueIndexes(this DbContext context) { var tables = GetTables(context); ... }
private static Dictionary<string, TableInfo> GetTables(DbContext context) { var tablesInfo = new Dictionary<string, TableInfo>(); var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace; var tables = metadata.GetItemCollection(DataSpace.SSpace) .GetItems<EntityContainer>() .Single() .BaseEntitySets .OfType<EntitySet>() .Where(s => !s.MetadataProperties.Contains("Type") || s.MetadataProperties["Type"].ToString() == "Tables"); foreach (var table in tables) { var tableName = table.MetadataProperties.Contains("Table") && table.MetadataProperties["Table"].Value != null ? table.MetadataProperties["Table"].Value.ToString() : table.Name; var tableSchema = table.MetadataProperties["Schema"].Value.ToString(); tablesInfo.Add(table.Name, new TableInfo { EntityName = table.Name, TableName = tableName, TableSchema = tableSchema, }); } return tablesInfo; }
public static void ExecuteUniqueIndexes(this DbContext context) { var tables = GetTables(context); var query = ""; foreach (var dbSet in GetDbSets(context)) { .... }
public static void ExecuteUniqueIndexes(this DbContext context) { ... foreach (var dbSet in GetDbSets(context)) { var entityType = dbSet.PropertyType.GetGenericArguments().First(); var table = tables[entityType.Name]; var currentIndexes = GetCurrentUniqueIndexes(context, table.TableName); } }
public static string GetFieldName(DbContext context, Type entityModel, string propertyName) { var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace; var osMembers = metadata.GetItem<EntityType>(entityModel.FullName, DataSpace.OSpace).Properties; var ssMebers = metadata.GetItem<EntityType>("CodeFirstDatabaseSchema." + entityModel.Name, DataSpace.SSpace).Properties; if (!osMembers.Contains(propertyName)) return null; var index = osMembers.IndexOf(osMembers[propertyName]); return ssMebers[index].Name; }
protected override void Seed(myDbContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // context.ExecuteUniqueIndexes(); }