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如果您需要更多的說明,我會很樂意爲您提供幫助! –