日期:2014-05-18  浏览次数:21033 次

linq to sqlite的更新问题
IDE:vs2010 C#
sqlite provider
http://system.data.sqlite.org/downloads/1.0.80.0/sqlite-netFx40-setup-bundle-x86-2010-1.0.80.0.exe
项目里直接引用的System.Data.Sqlite.dll
表结构:
SQL code

create table tags
(
   tagId guid primary key,
   title varchar(50),
   createdDate datetime
)


实体类:
C# code

[Table(Name="tags")]
public class Tag
{
   [Column(Name="tagId",IsPrimaryKey=true,DbType="varchar(50)")]
   public Guid TagId { get; set; }

   [Column(Name = "title")]
   public string Title { get; set; }

   [Column(Name = "createdDate")]
   public DateTime CreatedDate { get; set; }
}

public class TagDataContext : DataContext
{
   public Table<Tag> Tag;

   public TagDataContext(SQLiteConnection con) : base(con) { }
}



更新代码:
C# code

string strcon = "Data Source = notesdb.db3;pooling=true;failifmissing=false;";
TagDataContext ctx = new TagDataContext(new SQLiteConnection(strcon));
Tag t = ctx.Tag.Single(x => x.Title == "99999");
t.Title = "呵呵";
ctx.SubmitChanges();



代码和环境就是上边这些了,问题是这样的.在利用linq进行更新的时候.总会抛出异常"找不到行或者行已更改".出现这问题首先搜了下网上的解决办法.就那么两篇文章介绍这个问题.而解决办法就是那三种.update check,主键,还有ObjectChangeConflict.Resolve(RefreshMode);
但依然出现这个问题,后来试了下之前写的小程序,发现实体类里只要主键不是Guid就可以进行更新.但是在网上发现也有使用Guid类型的主键.
然后利用vs2010自带的sqlserver自动创建实体类,发现主键添加了DbType="uniqueidentify" 但是sqlite没有这个类型(依然是同样的异常),最后改成DbType="varchar(50)".问题才解决.
想请问大家几个问题:
1:为什么DbType为varchar的时候可以进行更新
这个DbType参数在更新过程中执行了什么操作
由于抛异常DataContext.log看不见.

2:sqlite中guid应该设置什么类型比较好

3:怎么在插入和更新操作中把DateTime格式化
现在的createdDate字段存储的记过全部是精确到毫秒级的
例如:2012-3-5 12:3:6:15251转换成 2010-03-05 12:03:06就可以了

4:有没有自动生成实体类的工具,手敲要吐了,表太多了.


------解决方案--------------------
有没有自动生成实体类的工具,手敲要吐了,表太多了.
自带的就有
------解决方案--------------------
探讨

有没有自动生成实体类的工具,手敲要吐了,表太多了.
自带的就有