.Net新手通常容易把属性(Property)跟特性(Attribute)搞混,其实这是两种不同的东西
属性指的类中封装的数据字段;而特性是对类、字段、方法和属性等元素标注的声明性信息
如下代码(Id、Name为User的属性,[DbKey]为Id的特性)
/// <summary> /// 用户信息 /// </summary> public class User { [DbKey] public string Id { get; set; } public string Name { get; set; } }
特性分预定义特性和自定义特性,本节主要讲述自定义特性
特性能解决什么问题?
假如现在需要通过定义一些实体类,动态创建出对应的数据库表,该怎么做呢?
直接上代码
namespace CustomerAttribute { /// <summary> /// 数据库主键 /// </summary> public class DbKey : Attribute { public string Description { get; set; } public DbKey() { } public DbKey(string description) { this.Description = description; } } }
namespace CustomerAttribute { /// <summary> /// 用户信息 /// </summary> public class User { [DbKey] public string Id { get; set; } public string Name { get; set; } } /// <summary> /// 用户角色 /// </summary> public class UserRole { [DbKey("用户ID")] public string UserId { get; set; } [DbKey("角色ID")] public string RoleId { get; set; } } }
namespace CustomerAttribute { class Program { /// <summary> /// 获取数据库主键字段 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> private static IEnumerable<PropertyInfo> getDbKeyFields<T>() { // 获取当前类中的公共字段 var fields = typeof(T).GetProperties(); // 查找有DbKey特性的字段 var keyFields = fields.Where(field => (DbKey)Attribute.GetCustomAttribute(field, typeof(DbKey)) != null); return keyFields; } private static string getDescription(PropertyInfo field) { string result = string.Empty; var dbKey = (DbKey)Attribute.GetCustomAttribute(field, typeof(DbKey)); if (dbKey != null) result = dbKey.Description; return result; } static void Main(string[] args) { try { var userKeyFields = getDbKeyFields<User>(); Console.WriteLine("User表的主键为:" + string.Join(",", userKeyFields.Select(field => field.Name))); var userRoleKeyFields = getDbKeyFields<UserRole>(); Console.WriteLine("UserRole表的主键为:" + string.Join(",", userRoleKeyFields.Select(field => field.Name))); foreach (PropertyInfo field in userRoleKeyFields) { string description = getDescription(field); Console.WriteLine(string.Format("{0}字段的描述信息为:{1}", field.Name, description)); } } catch (Exception ex) { Console.WriteLine(ex); } finally { Console.ReadLine(); } } } }
从上边代码可以看出来,特性本身也是类,继承自Attribute类,我们可以对类、方法、属性等元素进行特性标注
上边是一个简单示例,我们可以通过自定义[DbKey]特性,标注在需要设置主键的字段上
需要动态创建数据库的时候,可以从实体类中解析出表名、字段名、主键字段、字段说明等等,然后生成创建数据库表的脚本,动态创建数据库表
创建数据库的代码,后边可以进一步补充
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持小牛知识库!
问题内容: 我有一个由DBA创建的表。我想为每个表提供实体类以进行进一步查询。有人可以建议如何使用eclipse自动创建实体类吗? 问题答案: 如果使用JPA进行持久化,则可以使用Eclipse提供的“ JPA工具”从表生成Java实体类。 这是教程
我正在使用从数据库中获取一些数据。如果我使用,我的resultset是一个类的列表,这是需要的。 如果我没有获取整行内容,我如何让自动创建实体?
问题内容: 我有以下实体类(在Groovy中): 和我的persistence.xml: 和脚本: 数据库 Icarus 存在,但当前没有表。我希望Hibernate基于实体类自动创建和/或更新表。我将如何完成? 问题答案: 我不知道离开前线是否会有所作为。 该参考表明,它应该是 值为将会在创建sessionFactory时创建您的表,并保持它们不变。 值为会创建您的表,然后在关闭sessionF
问题内容: 我正在尝试执行本教程http://www.asp.net/mvc/tutorials/getting-started-with-aspnet- mvc3/getting-started-with- mvc3-part4-cs, 但不是使用精简版的SQL Server我在本地计算机上使用完整安装。我阅读本教程的方式是,实体框架是根据我定义的对象创建表的。我的问题是,在运行项目时,我总是得
我有一个DBA创建的表。我想为每个表提供实体类以供进一步查询。有人能建议如何使用eclipse自动创建实体类吗?
标准对象工厂可能如下所示: 是否可以设置绑定以便为我完成切换,即我所做的只是调用 getInstance 或注入?我正在研究辅助注射,但这似乎是不同的主题:https://code.google.com/p/google-guice/wiki/AssistedInject