Gentle中的数据表实体类相关自定义属性的设置和获得
2007-07-18 13:00
597 查看
1.自定义 表名属性 TableNameAttribute
2.自定义 主键属性 PrimaryKeyAttribute
3.自定义 列名属性 TableColumnAttribute
4.数据表person对应的实体类person.cs
5.获得person.cs类型实体 对应的表名及字段名
=========================================
下面的属性代码文件 都直接建立在App_Code下 以方便使用
1.自定义 表名属性 TableNameAttribute
------------------------------------
using System;
/**//// <summary>
/// TableNameAttribute 的摘要说明
/// </summary>
[AttributeUsage( AttributeTargets.Class, AllowMultiple=false, Inherited=true )]
public sealed class TableNameAttribute : Attribute
{
private string name;
private string schema;
//private CacheStrategy cacheStrategy = GentleSettings.DefaultCacheStrategy;
/**//// <summary>
/// The constructor for the TableName attribute.
/// </summary>
/// <param name="name">The name of the database table used to store instances of this class.</param>
public TableNameAttribute( string name )
{
this.name = name;
}
/**//// <summary>
/// The constructor for the TableName attribute.
/// </summary>
/// <param name="name">The name of the database table used to store instances of this class.</param>
/// <param name="strategy">The cache stratgey to use for instances of this type. <see
/// cref="CacheStrategy"/> for a list of available options.</param>
//public TableNameAttribute( string name, CacheStrategy strategy )
//{
// this.name = name;
// this.cacheStrategy = strategy;
//}
/**//// <summary>
/// The name of the database table used to store instances of this class.
/// </summary>
public string Name
{
get
{ return name; }
}
/**//// <summary>
/// The optional schema name with which to prefix the table name in queries.
/// This value overrides the default schema definition (if present) in the
/// configuration file. Note: this property is currently unused.
/// </summary>
public string Schema
{
get
{ return schema; }
set
{ schema = value; }
}
/**////// <summary>
///// The cache behavior for objects of this type. <see cref="CacheStrategy"/>
///// for a list of available options.
///// </summary>
//public CacheStrategy CacheStrategy
//{
// get { return cacheStrategy; }
// set { cacheStrategy = value; }
//}
}
2.自定义 主键属性 PrimaryKeyAttribute
------------------------------------
using System;
/**//// <summary>
/// PrimaryKeyAttribute 的摘要说明
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true, Inherited = true)]
public sealed class PrimaryKeyAttribute : Attribute
{
private bool autoGenerated = false;
/**//// <summary>
/// Set this property to true for primary keys that are automatically assigned
/// by the database on insert (identity columns in SQL server terminology).
/// </summary>
public bool AutoGenerated
{
get
{ return autoGenerated; }
set
{ autoGenerated = value; }
}
}
3.自定义 列名属性 TableColumnAttribute
--------------------------------------
using System;
using System.Data;
/**//// <summary>
/// TableColumnAttribute 的摘要说明
/// </summary>
[AttributeUsage( AttributeTargets.Property | AttributeTargets.Field, AllowMultiple=false, Inherited=true )]
public class TableColumnAttribute : Attribute
{
private string name;
private bool notNull;
private int size;
private bool hasDbType = false; // true when DbType property has been set
private long dbType;
private object nullValue = null;
private bool handleEnumAsString = false;
private bool isReadOnly = false;
private bool isUpdateAfterWrite = false;
/**//// <summary>
/// Constructor for table columns that are named after their property counterpart
/// and whose value cannot be null.
/// </summary>
public TableColumnAttribute()
: this(null, true)
{
}
/**//// <summary>
/// Constructor for table columns that are named after their property counterpart.
/// </summary>
/// <param name="notNull">A boolean telling whether null values are allowed in the database</param>
public TableColumnAttribute(bool notNull)
: this(null, notNull)
{
}
/**//// <summary>
/// Constructor for table columns whose value cannot be null.
/// </summary>
/// <param name="name">The name of the database column</param>
public TableColumnAttribute(string name)
: this(name, true)
{
}
/**//// <summary>
/// Constructor for table columns.
/// </summary>
/// <param name="name">The name of the database column</param>
/// <param name="notNull">A boolean telling whether null values are allowed in the database</param>
public TableColumnAttribute(string name, bool notNull)
{
this.name = name;
this.notNull = notNull;
}
/**//// <summary>
/// The name of the database column for storing the property decorated with this attribute.
/// </summary>
public string Name
{
get
{ return name; }
}
/**//// <summary>
/// This property (defaults to true) can be used to specify whether NULL values are
/// allowed in the database. This allows the framework to fail early if a constraint
/// is violated.
/// </summary>
public bool NotNull
{
get
{ return notNull; }
set
{ notNull = value; }
}
/**//// <summary>
/// The database type of the field in the database. Beware that the DbType enumeration
/// values are NOT the ones used by the individual providers. Gentle does NOT convert
/// the DbType to a "best match" for the provider. It is therefore recommended that
/// you use the DatabaseType below until a better type definition system is available.
/// </summary>
[Obsolete("Please use DatabaseType instead.")]
public DbType DbType
{
get
{ return (DbType)dbType; }
set
{
hasDbType = true;
dbType = (long)value;
}
}
/**//// <summary>
/// The database type of the field in the database. Convert the actual database type
/// enumeration to a long by casting it in the declaration.
/// </summary>
public long DatabaseType
{
get
{ return dbType; }
set
{
hasDbType = true;
dbType = value;
}
}
/**//// <summary>
/// The size or length of the field in the database. String properties will be clipped
/// to fit.
/// This feature will obsoleted once Gentle is capable of extracting type and size
/// information directly from the database. If specified, the values must match
/// those extracted from the database (when implemented).
/// </summary>
public int Size
{
get
{ return size; }
set
{ size = value; }
}
/**//// <summary>
/// This property indicates whether a DbType was specified. This construct is necessary
/// because the DbType enum has no value for undefined.
/// </summary>
public bool HasDbType
{
get
{ return hasDbType; }
}
/**//// <summary>
/// Obsolete, use NullValue instead.
/// </summary>
[Obsolete("Use NullValue instead.")]
public object MagicValue
{
get
{ return nullValue; }
set
{ nullValue = value; }
}
/**//// <summary>
/// This value of this property is used when a column is NotNull and the property value
/// is null. If this is undefined the framework will throw an error for NotNull columns
/// whose values are null.
/// </summary>
public object NullValue
{
get
{ return nullValue; }
set
{ nullValue = value; }
}
NullValue Helper Properties for VB.NET Users#region NullValue Helper Properties for VB.NET Users
/**//// <summary>
/// This property allows type-safe setting of the NullValue for VB users.
/// </summary>
public int NullValue_int
{
set
{ NullValue = value; }
}
/**//// <summary>
/// This property allows type-safe setting of the NullValue for VB users.
/// </summary>
public NullOption NullValue_opt
{
set
{ NullValue = value; }
}
#endregion
/**//// <summary>
/// This value indicates that the column should not be set on insert and update. It is
/// primarily useful for columns that are set internally by the database.
/// </summary>
public bool IsReadOnly
{
get
{ return isReadOnly; }
set
{ isReadOnly = value; }
}
/**//// <summary>
/// This value indicates that the column must be read after each insert and update. It is
/// primarily useful for columns that are set internally by the database. Note that using
/// this feature (by setting this to true for any column) will significantly impact
/// performance for the worse, as for every update/insert another select will be
/// performed. Also, fields will be updated using reflection after select, which is also
/// quite slow (depending on the number of columns).
/// </summary>
public bool IsUpdateAfterWrite
{
get
{ return isUpdateAfterWrite; }
set
{ isUpdateAfterWrite = value; }
}
/**//// <summary>
/// If member which has this attribute attached is enum then this property
/// indicates wheter framework saves it as string or as integer.
/// Default is false, ie enums are saved as integers
/// </summary>
public bool HandleEnumAsString
{
get
{ return handleEnumAsString; }
set
{ handleEnumAsString = value; }
}
}
public enum NullOption
{
/**//// <summary>
/// <type>.MinValue will be stored as NULL, and NULL will be read as <type>.MinValue.
/// </summary>
MinValue,
/**//// <summary>
/// <type>.MaxValue will be stored as NULL, and NULL will be read as <type>.MaxValue.
/// </summary>
MaxValue,
/**//// <summary>
/// 0 (or the equivalent for other numeric types) will be stored as NULL, and NULL will be read as 0.
/// </summary> This value can only be used with numeric types (such as decimal).
Zero,
/**//// <summary>
/// Guid.Empty will be stored as NULL, and NULL will be read as Guid.Empty. This value can only be
/// used with Guid fields.
/// </summary>
EmptyGuid
}
4.数据表person对应的实体类person.cs
------------------------------------
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/**//// <summary>
/// person 的摘要说明
/// </summary>
[TableName("person")]
public class person
{
public person()
{
}
//[TableColumn("personID", NotNull = true), PrimaryKey]
protected int _personID;
//[TableColumn("personName", NotNull = true)]
protected string _personName = String.Empty;
[TableColumn("personID", NotNull = true), PrimaryKey]
public int PersonID
{
get
{ return _personID; }
set
{ _personID = value; }
}
[TableColumn("personName", NotNull = true)]
public string PersonName
{
get
{ return _personName; }
set
{ _personName = value; }
}
}
5.获得person.cs类型实体 对应的表名及字段名
------------------------------------------
protected void Button1_Click(object sender, EventArgs e)
{
person aPerson = new person();
aPerson.PersonID = 22;
aPerson.PersonName = "zhangsan";
Type aType = aPerson.GetType();
//类实体公开属性对应的列名属性
PropertyInfo[] aPropertyInfos = aType.GetProperties();
string strPublicProperty = " ";
for (int i = 0; i < aPropertyInfos.Length; i++)
{
PropertyInfo aPropertyInfo = (PropertyInfo)aPropertyInfos[i];
strPublicProperty += i.ToString() + " : 实体属性名 " + aPropertyInfo.Name;
strPublicProperty += " 对应值 " + aPropertyInfo.GetValue(aPerson, null).ToString() + " ";
object[] attrs = aPropertyInfo.GetCustomAttributes(typeof(TableColumnAttribute), true);
for (int m = 0; m < attrs.Length; m++)
{
strPublicProperty += " 对应列名 " + ((TableColumnAttribute)attrs[m]).Name;
}
}
this.TextBox1.Text = strPublicProperty;
//FieldInfo[] aFieldInfos = aType.GetFields();
//string strPublicField = " ";
//for (int j = 0; j < aFieldInfos.Length; j++)
//{
// FieldInfo aFieldInfo = (FieldInfo)aFieldInfos[j];
// strPublicField += j.ToString() + " : " + aFieldInfo.Name + " ";
//}
//this.TextBox2.Text = strPublicField;
//类实体对应的表名属性
string strTablePKName = " ";
object[] attrsAA = aType.GetCustomAttributes(typeof(TableNameAttribute), true);
for (int n = 0; n < attrsAA.Length; n++)
{
strTablePKName += " " + ((TableNameAttribute)attrsAA
).Name;
}
//类实体对应的主键属性
MemberInfo[] aMemberInfos = aType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
string strMemberInfo = " ";
for (int k = 0; k < aMemberInfos.Length; k++)
{
MemberInfo aM = aMemberInfos[k];
object[] attrs = aM.GetCustomAttributes(typeof(PrimaryKeyAttribute), true);
for (int m = 0; m < attrs.Length; m++)
{
strTablePKName += " 主键 " + aM.Name;
}
}
this.TextBox2.Text = strTablePKName;
}
2.自定义 主键属性 PrimaryKeyAttribute
3.自定义 列名属性 TableColumnAttribute
4.数据表person对应的实体类person.cs
5.获得person.cs类型实体 对应的表名及字段名
=========================================
下面的属性代码文件 都直接建立在App_Code下 以方便使用
1.自定义 表名属性 TableNameAttribute
------------------------------------
using System;
/**//// <summary>
/// TableNameAttribute 的摘要说明
/// </summary>
[AttributeUsage( AttributeTargets.Class, AllowMultiple=false, Inherited=true )]
public sealed class TableNameAttribute : Attribute
{
private string name;
private string schema;
//private CacheStrategy cacheStrategy = GentleSettings.DefaultCacheStrategy;
/**//// <summary>
/// The constructor for the TableName attribute.
/// </summary>
/// <param name="name">The name of the database table used to store instances of this class.</param>
public TableNameAttribute( string name )
{
this.name = name;
}
/**//// <summary>
/// The constructor for the TableName attribute.
/// </summary>
/// <param name="name">The name of the database table used to store instances of this class.</param>
/// <param name="strategy">The cache stratgey to use for instances of this type. <see
/// cref="CacheStrategy"/> for a list of available options.</param>
//public TableNameAttribute( string name, CacheStrategy strategy )
//{
// this.name = name;
// this.cacheStrategy = strategy;
//}
/**//// <summary>
/// The name of the database table used to store instances of this class.
/// </summary>
public string Name
{
get
{ return name; }
}
/**//// <summary>
/// The optional schema name with which to prefix the table name in queries.
/// This value overrides the default schema definition (if present) in the
/// configuration file. Note: this property is currently unused.
/// </summary>
public string Schema
{
get
{ return schema; }
set
{ schema = value; }
}
/**////// <summary>
///// The cache behavior for objects of this type. <see cref="CacheStrategy"/>
///// for a list of available options.
///// </summary>
//public CacheStrategy CacheStrategy
//{
// get { return cacheStrategy; }
// set { cacheStrategy = value; }
//}
}
2.自定义 主键属性 PrimaryKeyAttribute
------------------------------------
using System;
/**//// <summary>
/// PrimaryKeyAttribute 的摘要说明
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true, Inherited = true)]
public sealed class PrimaryKeyAttribute : Attribute
{
private bool autoGenerated = false;
/**//// <summary>
/// Set this property to true for primary keys that are automatically assigned
/// by the database on insert (identity columns in SQL server terminology).
/// </summary>
public bool AutoGenerated
{
get
{ return autoGenerated; }
set
{ autoGenerated = value; }
}
}
3.自定义 列名属性 TableColumnAttribute
--------------------------------------
using System;
using System.Data;
/**//// <summary>
/// TableColumnAttribute 的摘要说明
/// </summary>
[AttributeUsage( AttributeTargets.Property | AttributeTargets.Field, AllowMultiple=false, Inherited=true )]
public class TableColumnAttribute : Attribute
{
private string name;
private bool notNull;
private int size;
private bool hasDbType = false; // true when DbType property has been set
private long dbType;
private object nullValue = null;
private bool handleEnumAsString = false;
private bool isReadOnly = false;
private bool isUpdateAfterWrite = false;
/**//// <summary>
/// Constructor for table columns that are named after their property counterpart
/// and whose value cannot be null.
/// </summary>
public TableColumnAttribute()
: this(null, true)
{
}
/**//// <summary>
/// Constructor for table columns that are named after their property counterpart.
/// </summary>
/// <param name="notNull">A boolean telling whether null values are allowed in the database</param>
public TableColumnAttribute(bool notNull)
: this(null, notNull)
{
}
/**//// <summary>
/// Constructor for table columns whose value cannot be null.
/// </summary>
/// <param name="name">The name of the database column</param>
public TableColumnAttribute(string name)
: this(name, true)
{
}
/**//// <summary>
/// Constructor for table columns.
/// </summary>
/// <param name="name">The name of the database column</param>
/// <param name="notNull">A boolean telling whether null values are allowed in the database</param>
public TableColumnAttribute(string name, bool notNull)
{
this.name = name;
this.notNull = notNull;
}
/**//// <summary>
/// The name of the database column for storing the property decorated with this attribute.
/// </summary>
public string Name
{
get
{ return name; }
}
/**//// <summary>
/// This property (defaults to true) can be used to specify whether NULL values are
/// allowed in the database. This allows the framework to fail early if a constraint
/// is violated.
/// </summary>
public bool NotNull
{
get
{ return notNull; }
set
{ notNull = value; }
}
/**//// <summary>
/// The database type of the field in the database. Beware that the DbType enumeration
/// values are NOT the ones used by the individual providers. Gentle does NOT convert
/// the DbType to a "best match" for the provider. It is therefore recommended that
/// you use the DatabaseType below until a better type definition system is available.
/// </summary>
[Obsolete("Please use DatabaseType instead.")]
public DbType DbType
{
get
{ return (DbType)dbType; }
set
{
hasDbType = true;
dbType = (long)value;
}
}
/**//// <summary>
/// The database type of the field in the database. Convert the actual database type
/// enumeration to a long by casting it in the declaration.
/// </summary>
public long DatabaseType
{
get
{ return dbType; }
set
{
hasDbType = true;
dbType = value;
}
}
/**//// <summary>
/// The size or length of the field in the database. String properties will be clipped
/// to fit.
/// This feature will obsoleted once Gentle is capable of extracting type and size
/// information directly from the database. If specified, the values must match
/// those extracted from the database (when implemented).
/// </summary>
public int Size
{
get
{ return size; }
set
{ size = value; }
}
/**//// <summary>
/// This property indicates whether a DbType was specified. This construct is necessary
/// because the DbType enum has no value for undefined.
/// </summary>
public bool HasDbType
{
get
{ return hasDbType; }
}
/**//// <summary>
/// Obsolete, use NullValue instead.
/// </summary>
[Obsolete("Use NullValue instead.")]
public object MagicValue
{
get
{ return nullValue; }
set
{ nullValue = value; }
}
/**//// <summary>
/// This value of this property is used when a column is NotNull and the property value
/// is null. If this is undefined the framework will throw an error for NotNull columns
/// whose values are null.
/// </summary>
public object NullValue
{
get
{ return nullValue; }
set
{ nullValue = value; }
}
NullValue Helper Properties for VB.NET Users#region NullValue Helper Properties for VB.NET Users
/**//// <summary>
/// This property allows type-safe setting of the NullValue for VB users.
/// </summary>
public int NullValue_int
{
set
{ NullValue = value; }
}
/**//// <summary>
/// This property allows type-safe setting of the NullValue for VB users.
/// </summary>
public NullOption NullValue_opt
{
set
{ NullValue = value; }
}
#endregion
/**//// <summary>
/// This value indicates that the column should not be set on insert and update. It is
/// primarily useful for columns that are set internally by the database.
/// </summary>
public bool IsReadOnly
{
get
{ return isReadOnly; }
set
{ isReadOnly = value; }
}
/**//// <summary>
/// This value indicates that the column must be read after each insert and update. It is
/// primarily useful for columns that are set internally by the database. Note that using
/// this feature (by setting this to true for any column) will significantly impact
/// performance for the worse, as for every update/insert another select will be
/// performed. Also, fields will be updated using reflection after select, which is also
/// quite slow (depending on the number of columns).
/// </summary>
public bool IsUpdateAfterWrite
{
get
{ return isUpdateAfterWrite; }
set
{ isUpdateAfterWrite = value; }
}
/**//// <summary>
/// If member which has this attribute attached is enum then this property
/// indicates wheter framework saves it as string or as integer.
/// Default is false, ie enums are saved as integers
/// </summary>
public bool HandleEnumAsString
{
get
{ return handleEnumAsString; }
set
{ handleEnumAsString = value; }
}
}
public enum NullOption
{
/**//// <summary>
/// <type>.MinValue will be stored as NULL, and NULL will be read as <type>.MinValue.
/// </summary>
MinValue,
/**//// <summary>
/// <type>.MaxValue will be stored as NULL, and NULL will be read as <type>.MaxValue.
/// </summary>
MaxValue,
/**//// <summary>
/// 0 (or the equivalent for other numeric types) will be stored as NULL, and NULL will be read as 0.
/// </summary> This value can only be used with numeric types (such as decimal).
Zero,
/**//// <summary>
/// Guid.Empty will be stored as NULL, and NULL will be read as Guid.Empty. This value can only be
/// used with Guid fields.
/// </summary>
EmptyGuid
}
4.数据表person对应的实体类person.cs
------------------------------------
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/**//// <summary>
/// person 的摘要说明
/// </summary>
[TableName("person")]
public class person
{
public person()
{
}
//[TableColumn("personID", NotNull = true), PrimaryKey]
protected int _personID;
//[TableColumn("personName", NotNull = true)]
protected string _personName = String.Empty;
[TableColumn("personID", NotNull = true), PrimaryKey]
public int PersonID
{
get
{ return _personID; }
set
{ _personID = value; }
}
[TableColumn("personName", NotNull = true)]
public string PersonName
{
get
{ return _personName; }
set
{ _personName = value; }
}
}
5.获得person.cs类型实体 对应的表名及字段名
------------------------------------------
protected void Button1_Click(object sender, EventArgs e)
{
person aPerson = new person();
aPerson.PersonID = 22;
aPerson.PersonName = "zhangsan";
Type aType = aPerson.GetType();
//类实体公开属性对应的列名属性
PropertyInfo[] aPropertyInfos = aType.GetProperties();
string strPublicProperty = " ";
for (int i = 0; i < aPropertyInfos.Length; i++)
{
PropertyInfo aPropertyInfo = (PropertyInfo)aPropertyInfos[i];
strPublicProperty += i.ToString() + " : 实体属性名 " + aPropertyInfo.Name;
strPublicProperty += " 对应值 " + aPropertyInfo.GetValue(aPerson, null).ToString() + " ";
object[] attrs = aPropertyInfo.GetCustomAttributes(typeof(TableColumnAttribute), true);
for (int m = 0; m < attrs.Length; m++)
{
strPublicProperty += " 对应列名 " + ((TableColumnAttribute)attrs[m]).Name;
}
}
this.TextBox1.Text = strPublicProperty;
//FieldInfo[] aFieldInfos = aType.GetFields();
//string strPublicField = " ";
//for (int j = 0; j < aFieldInfos.Length; j++)
//{
// FieldInfo aFieldInfo = (FieldInfo)aFieldInfos[j];
// strPublicField += j.ToString() + " : " + aFieldInfo.Name + " ";
//}
//this.TextBox2.Text = strPublicField;
//类实体对应的表名属性
string strTablePKName = " ";
object[] attrsAA = aType.GetCustomAttributes(typeof(TableNameAttribute), true);
for (int n = 0; n < attrsAA.Length; n++)
{
strTablePKName += " " + ((TableNameAttribute)attrsAA
).Name;
}
//类实体对应的主键属性
MemberInfo[] aMemberInfos = aType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
string strMemberInfo = " ";
for (int k = 0; k < aMemberInfos.Length; k++)
{
MemberInfo aM = aMemberInfos[k];
object[] attrs = aM.GetCustomAttributes(typeof(PrimaryKeyAttribute), true);
for (int m = 0; m < attrs.Length; m++)
{
strTablePKName += " 主键 " + aM.Name;
}
}
this.TextBox2.Text = strTablePKName;
}
相关文章推荐
- Gentle中的数据表实体类相关自定义属性的设置和获得
- 普元EOS Platform7.6如何使用数据实体属性设置中的乐观锁
- highcharts图表组件通过设置tooltip属性自定义数据提示信息
- 通过自定义属性存储数据实现输入框获得焦点与失去焦点改变value值
- highcharts图表组件通过设置tooltip属性自定义数据提示信息
- JPA学习笔记---JPA实体Bean的建立---链接上一个博文:对实体Bean中属性进行操作:保存日期类型,设置字段的长度,名字,是否为空,可以声明枚举字段;可以存放二进制数据,可以存放
- web 自定义监听器中设置加载系统相关的静态变量及属性
- 数据存储小结,属性列表,archiver 偏好设置,Sqlite3,Core Data
- 接口式实体定义之——自定义实体属性+实体多根继承
- 导航栏设置返回按钮为自定义的 button 这时候设置 button 的一些属性
- css中cursor自定义光标的相关属性
- Textbox设置属性ReadOnly后,后台无法获得js赋的值
- 如何根据某个实体属性字段的不同值来设置另一个实体属性字段的值
- css字体设置相关属性
- 自定义AlertDialog的实现以及添加属性设置背景
- java为树形tree数据 添加属性 设置已选
- 自定义获取WI-FI列表及相关设置
- .net session超时设置 sessionState的相关属性
- Dynamics CRM 修改自定义实体名字及属性前缀(架构名称)
- javascript取网页DOM自定义属性值和设置自定义属性值的通用方法