光脚丫学LINQ(043):为实体类的列成员指定在数据库中的数据类型

视频演示:http://u.115.com/file/f21113c26

演示重点
通过给实体类成员的ColumnAttribute特性设置DbType属性,
就可以为列成员指定它在数据库中的数据类型了。
赋值给DbType的属性值是一个字符串。
此字符串可以包含数据类型,数据的大小,以及是否为空。
比如ColumnAttribute.DbType="NVarChar(40) NOT NULL"
事实上,只有当我们根据对象模型来创建数据库的时候,这个属性才是有用。
也就是调用数据上下文DataContext.CreateDatabase()方法时。
当调用此方法时,它才会读取DbType的属性值,然后据此来确定所创建的数据表的列的数据类型。
而通常使用对象模型对数据进行增删查改这些基本操作的时候,貌似这个属性就没什么用武之地了。

另外,也演示了如何通过对象模型来创建数据库。
这其中分别涉及到了以下3个方法:
DataContext.DatabaseExists():确定是否已经存在指定的数据库。
DataContext.DeleteDatabase():删除指定的数据库。
DataContext.CreateDatabase():根据对象模型创建数据库。
使用对象模型创建数据库的时候,如果没有为实体类的列成员设置ColumnAttribute.DbType属性,
那么就会使用NVarchar(4000)作为默认数据类型。
基于这个理由,如果我们要使用对象模型创建数据库的话,
那最好还是显示而明确的设置实体类列成员的ColumnAttribute.DbType。
而且一定要设置为有效的类型,否则LINQ to SQL所生成的CREATE TABLE命令就会包含无效的数据类型,
自然也就不会被成功执行了。
但如果不用对象模型创建数据库的话,设置了此属性反而是多此一举了。^_^

关键代码
下面的代码演示如何为实体类的列成员指定它在数据库中的数据类型,重点是DbType属性。

[Column(Storage="_ContactTitle",
    DbType="NVarChar(30)")]
public string ContactTitle
{
 get
 {
  return this._ContactTitle;
 }
 set
 {
  if ((this._ContactTitle != value))
  {
   this.OnContactTitleChanging(value);
   this.SendPropertyChanging();
   this._ContactTitle = value;
   this.SendPropertyChanged("ContactTitle");
   this.OnContactTitleChanged();
  }
 }
}

下面的代码演示了如何让LINQ to SQL根据对象模型创建数据库。

NorthwindDataContext db =
    new NorthwindDataContext(@"C:\LINQ\NorthwindExpress.mdf");
db.Log = Console.Out;

if (db.DatabaseExists())
    db.DeleteDatabase();
db.CreateDatabase();

研习记录
此代码主要是用来研习ColumnAttribute.DbType属性的。
当希望使用DataContext.CreateDtabase()这个方法根据对象模型创建数据库的时候,这个属性尤其重要。
那么是否不设置这个属性,或者这个属性值设置无效的情况下,都将不能正确创建数据库呢?
当给DbType属性设置了一个无效的数据类型时,LINQ to SQL并不能够确定其是否有效。
它只会简单的用这个DbType的字符串属性值组合成一个创建数据库的SQL命令,
当这个命令发送给数据库的时候,却无法正确地执行,因为某个列的数据类型是无效的。
从这点来看LINQ to SQL还是有笨的地方。-_-
如果不设置DbType属性也可以,不过此时LINQ to SQL会用NVarChar(4000)这个作为其默认类型。
看看这个,我觉得还是明确的指定出来数据类型吧!
如果对象模型的本身不是用来创建数据库,而仅仅是为了操作已经创建好的数据库中的数据,
那么完全可以不为列属性设置这个DbType属性值。
这并不会影响使用效果的。
但如果要想根据对象模型来创建数据库的话,那最好还是明确的指定出来数据类型吧!

光脚丫思考 2010-12-28

原文地址:https://www.cnblogs.com/GJYSK/p/1921236.html