在MS-SQL
中设计表格时,您可以选择为添加到表格的每个列添加description
。 EF Code First
在Data Annotations
的帮助下可以做到吗?在EF代码中首先是否存在描述字段的数据注释?
回答
您使用我的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) { } } } }
感谢您的解决方案。但这对我的需求来说有点复杂。无法理解。希望只有一个用于实体类的“属性”,它将描述添加到数据库中。 –
@afsharm此属性在EF中不存在,您必须通过自己创建它。有一个神奇的线看这些devleopers,他们有同样的问题,已经解决了迁移,这是比我的灵魂复杂很多http://stackoverflow.com/questions/10080601/how-to -add-description-to-columns-in-entity-framework-4-3-code-first-using-migra –
@afsharm如果您需要更多的说明,我会很乐意为您提供帮助! –
- 1. 首先在EF代码中枚举
- 2. 如何创建/更新EF代码中的LastModified字段首先
- 3. 异常在EF使用代码首先
- 4. 一个在EF代码首先
- 5. 组合键在EF 4.2代码首先
- 6. EF代码优先模型是否旨在完整地描述数据库的结构?
- 7. 如何在ASP.NET MVC应用程序中首先使用EF代码检查SQL表中是否存在数据?
- 8. 此代码是否描述了C#中的存在类型?
- 9. Ef中的代码首先映射
- 10. EF代码首先,数据库在哪里指定?
- 11. EF代码首先不懒加载只是后数据导入
- 12. 在EF代码中,首先是否可以封装应该保留到数据存储的属性?
- 13. “Key”数据注释在数据库中首先做了什么?
- 14. 如何添加不是注释的代码描述?
- 15. DataForm,DropBox和数据注释(描述等)
- 16. EF代码首先忽略属性到字段惯例?
- 17. 首先插入多行的EF代码
- 18. EF代码首先到SQL Server的Mysql
- 19. UnitOfWork和GenericRepository模式是否冗余首先在EF 4.1代码中?
- 20. EF 4.1代码优先 - 在Firebird数据库中存储图像
- 21. 如何访问注释属性中描述的字段
- 22. EF 4.2代码首先,使用现有的数据库?
- 23. EF代码首先一对多
- 24. EF代码首先不产生表
- 25. EF代码首先无法连接到数据库
- 26. EF 6代码首先从数据库模型生成错误
- 27. C# - 首先使用EF代码获取数据 - DbContext
- 28. 代码首先在数据库中添加默认字段值(ASP.NET MVC)
- 29. 如何在EF代码中首先需要关系
- 30. EF 4.1代码 - 首先在表格中添加触发器
你需要像[说明(“这里是财产详细描述”)]公众诠释PROPNAME {获取;集;}将在Db的创建EF列额外的无形? –
@BassamAlugili:数据注解是这样的,但这是否会在db中生成描述? –