3

MS-SQL中设计表格时,您可以选择为添加到表格的每个列添加descriptionEF Code FirstData Annotations的帮助下可以做到吗?在EF代码中首先是否存在描述字段的数据注释?

+0

你需要像[说明(“这里是财产详细描述”)]公众诠释PROPNAME {获取;集;}将在Db的创建EF列额外的无形? –

+0

@BassamAlugili:数据注解是这样的,但这是否会在db中生成描述? –

回答

0

您使用我的soultion请阅读一点点前:

扩展属性:
https://technet.microsoft.com/en-us/library/ms190243(v=sql.105).aspx

属性:
http://www.dotnetperls.com/attribute

我的解决方案将允许你为任何类似的财产做一个阴影描述:

[Description("My Column description!")] 
public string RegionCity { get; set; } 

注:

  • 复制粘贴soultion,一切都应该作品(donnot忘记在app.config连接字符串)!
  • 您可以使用sql命令IF NOT EXISTS来检查扩展属性是否已经存在。
  • 您可以构建自己的通用逻辑或C#扩展来读取任何属性的descirption,这应该很容易只是添加了一个字符串示例。

    using System; 
    using System.Linq; 
    
    namespace EntityFrameworkDemo 
    { 
    using System.Data.Entity; 
    
    public class Program 
    { 
        public static void Main() 
        { 
         Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>()); 
    
    
         using (var myDbContext = new MyDbContext("DefaultConnection")) 
         { 
          // Maybe you do not need this line! 
          myDbContext.Database.Initialize(true); 
    
          // Adding one time or use the IF NOT EXISTS SQL Command! 
          var c = new ColumnsDescription(); 
          c.AddColumnsDescriptions(myDbContext); 
    
          var region = new Region { RegionCity = "Test 1", RegionSeconcdCity = "Test2" }; 
          myDbContext.Regions.Add(region); 
          myDbContext.SaveChanges(); 
         } 
    
    
         // Reading the extended properties 
         using (var myDbContext = new MyDbContext("DefaultConnection")) 
         { 
          var ep = "select value from fn_listextendedproperty('MS_Description','schema','dbo','table', 'Regions', 'column', 'RegionCity');"; 
    
          // For example you can read your extend property like following or you make a generic reader 
          var properties = myDbContext.Database.SqlQuery<string>(ep).First(); 
    
          Console.WriteLine(properties); 
         } 
        } 
    
        [AttributeUsage(AttributeTargets.Property)] 
        public class DescriptionAttribute : Attribute 
        { 
         string value; 
    
         public DescriptionAttribute(string id) 
         { 
          this.value = id; 
         } 
    
         public string Value 
         { 
          get { return this.value; } 
         } 
        } 
    
        public class ColumnsDescription 
        { 
         public void AddColumnsDescriptions(DbContext mydbContext) 
         { 
          // Fetch all the DbContext class public properties which contains your attributes 
          var dbContextProperies = typeof(DbContext).GetProperties().Select(pi => pi.Name).ToList(); 
    
          // Loop each DbSets of type T 
          foreach (var item in typeof(MyDbContext).GetProperties() 
           .Where(p => dbContextProperies.IndexOf(p.Name) < 0) 
           .Select(p => p)) 
          { 
           if (!item.PropertyType.GetGenericArguments().Any()) 
           { 
            continue; 
           } 
    
           // Fetch the type of "T" 
           var entityModelType = item.PropertyType.GetGenericArguments()[0]; 
           var descriptionInfos = from prop in entityModelType.GetProperties() 
                 where prop.GetCustomAttributes(typeof(DescriptionAttribute), true).Any() 
                 select new { ColumnName = prop.Name, Attributes = prop.CustomAttributes }; 
    
           foreach (var descriptionInfo in descriptionInfos) 
           { 
            // Sql to create the description column and adding 
            var addDiscriptionColumnSql = 
             @"sp_addextendedproperty @name = N'MS_Description', @value = '" 
             + descriptionInfo.Attributes.First().ConstructorArguments.First() 
             + @"', @level0type = N'Schema', @level0name = dbo, @level1type = N'Table', @level1name = " 
             + entityModelType.Name + "s" + ", @level2type = N'Column', @level2name =" 
             + descriptionInfo.ColumnName; 
    
            var sqlCommandResult = mydbContext.Database.ExecuteSqlCommand(addDiscriptionColumnSql); 
           } 
          } 
         } 
        } 
    
        public class Region 
        { 
         public int Id { get; set; } 
    
         [Description("My Column description!")] 
         public string RegionCity { get; set; } 
    
         [Description("My Second Column description!")] 
         public string RegionSeconcdCity { get; set; } 
    
        } 
    
        public class MyDbContext : DbContext 
        { 
         public DbSet<Region> Regions { get; set; } 
    
         public MyDbContext(string connectionString) 
          : base("name=" + connectionString) 
         { 
         } 
        } 
    } 
    } 
    
+0

感谢您的解决方案。但这对我的需求来说有点复杂。无法理解。希望只有一个用于实体类的“属性”,它将描述添加到数据库中。 –

+0

@afsharm此属性在EF中不存在,您必须通过自己创建它。有一个神奇的线看这些devleopers,他们有同样的问题,已经解决了迁移,这是比我的灵魂复杂很多http://stackoverflow.com/questions/10080601/how-to -add-description-to-columns-in-entity-framework-4-3-code-first-using-migra –

+0

@afsharm如果您需要更多的说明,我会很乐意为您提供帮助! –

相关问题