none
DataContext+Linq出错~ RRS feed

  • 问题

  • 用SQLite数据库,做的一个DataContext,使用First时候出现如下错误:

    SQL logic error or missing database
    near ".": syntax error

    确定不是数据库连接错误,因为用IEnumerable取数据集是成功的~

                using (SQLiteDataContext db = new SQLiteDataContext())
                {
                    Party party = db.Partys.First(p => p.Name == "111");
                }

    SQLiteDataContext:

        [Database(Name = "SQLite")]
        public class SQLiteDataContext : System.Data.Linq.DataContext
        {
            public SQLiteDataContext()
                : base(new SQLiteConnection(@"Data Source=data.db"))
            {
    
            }
    
            public Table<Party> Partys
            {
                get { return this.GetTable<Party>(); }
            }
        }

    Model:

    [Table(Name = "Party")]
        public class Party
        {
            [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "Int NOT NULL IDENTITY")]
            public string ID { get; set; }
    
            [Column]
            public string Name { get; set; }
    
            [Column]
            public int IsPartyLeader { get; set; }
        }



    • 已编辑 Lacuz 2014年1月12日 17:37
    2014年1月12日 17:33

答案

  • 你好,

    会这样的情况,如果你不想删除掉原来的话,把.edmx文件创建在一个特定的文件夹下这样就会有不同的命名空间,也不会和你原来的Use类型冲突了.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Lacuz 2014年1月16日 13:22
    2014年1月14日 1:22
    版主

全部回复

  • 你好,楼主

    >>SQL logic error or missing database near ".": syntax error

    从错误信息来看,应该是产生的T-SQL语法上有问题,楼主试着用想SqlServer Profiler一样的工具追踪下真正执行的语句看看是不是有问题。

    不建议楼主使用LINQ2Sql的方式来连接Sqlite数据库, 使用Sqlite 提供的Entity Framework Porvider来操作:

    System.Data.SQLite

    关于如何用EFSqlite一起工作,这篇文章很不错:

    http://www.dotblogs.com.tw/mattyy/archive/2010/09/14/17717.aspx


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年1月13日 7:53
    版主
  • SqlServer Profiler 也可以追踪SQLite吗?
    2014年1月13日 14:05
  • 谢谢 @Fred Bao

    正在学习Entity Framework Porvider,感觉挺好用,有问题再来问

    2014年1月13日 14:56
  • 在使用Entity Framework的时候发现个问题,

    例如:我原本有建立实体模型User实体,里面包含账号密码,但是在用SQLite的时候User表我只希望保存账号,用Entity Framework Porvider实体数据模型生成出来的Entitis 的实体默认和数据表同名,这样和我之前建的Use实体就重名了,产生二义性,我该怎么处理这种2个相似实体的情况?

    2014年1月13日 15:55
  • 你好,

    会这样的情况,如果你不想删除掉原来的话,把.edmx文件创建在一个特定的文件夹下这样就会有不同的命名空间,也不会和你原来的Use类型冲突了.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Lacuz 2014年1月16日 13:22
    2014年1月14日 1:22
    版主
  • using (SQLiteEntities context = new SQLiteEntities())
                {
                    User u = context.Users.SingleOrDefault(u => u.LoginID == 'aaa');
                    if (u != null)
                    {
                        u.Password = 'bbb';
                    }
                    else
                    {
                        u = new dbUser()
                        {
                            LoginID = 'aaa',
                            Password = 'bbb'
                        };
                        context.AddTodbUsers(u);
                    }
                    context.SaveChanges();
                }

    我现在改成EF的了,但是新增的数据自增长ID字段加到数据库里是0。。。怎么回事。。。是integer类型的字段。。

    我要实现的效果是,提交用户数据,如果之前loginID存在的,就把新的密码更新进去,如果之前不存在就新增一条数据



    CREATE TABLE [User] (
        [ID] integer PRIMARY KEY AUTOINCREMENT NOT NULL,
        [LoginID] nvarchar(50) NOT NULL,
        [Password] nvarchar(50) NOT NULL
    );

    • 已编辑 Lacuz 2014年1月14日 15:10
    2014年1月14日 14:56
  • using (SQLiteEntities context = new SQLiteEntities())
                {
                    User u = context.Users.SingleOrDefault(u => u.LoginID == 'aaa');
                    if (u != null)
                    {
                        u.Password = 'bbb';
                    }
                    else
                    {
                        u = new dbUser()
                        {
                            LoginID = 'aaa',
                            Password = 'bbb'
                        };
                        context.AddTodbUsers(u);
                    }
                    context.SaveChanges();
                }

    我现在改成EF的了,但是新增的数据自增长ID字段加到数据库里是0。。。怎么回事。。。是integer类型的字段。。

    我要实现的效果是,提交用户数据,如果之前loginID存在的,就把新的密码更新进去,如果之前不存在就新增一条数据



    CREATE TABLE [User] (
        [ID] integer PRIMARY KEY AUTOINCREMENT NOT NULL,
        [LoginID] nvarchar(50) NOT NULL,
        [Password] nvarchar(50) NOT NULL
    );


    以前中文版的 EF 有个 BUG,每次重新保存 .edmx 文件后自增长 ID 的标记会从 .edmx 中消失,所以你可以打开 .edmx 文件,检查下 ID 字段上的自增长属性是否在,没有的话,就手动添加上。
    2014年1月15日 2:33
  • /// <summary>
            /// 没有元数据文档可用。
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
            [DataMemberAttribute()]
            public global::System.Int64 ID
            {
                get
                {
                    return _ID;
                }
                set
                {
                    if (_ID != value)
                    {
                        OnIDChanging(value);
                        ReportPropertyChanging("ID");
                        _ID = StructuralObject.SetValidValue(value);
                        ReportPropertyChanged("ID");
                        OnIDChanged();
                    }
                }
            }
            private global::System.Int64 _ID;
            partial void OnIDChanging(global::System.Int64 value);
            partial void OnIDChanged();
    这个应该是带了自增长的吧?
    2014年1月15日 14:24
  • 自增长应该是有数据库来控制的,楼主请检查下你的数据库里是否有设置为自增长。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年1月16日 8:59
    版主
  • 无缘无故的好了。。。
    2014年1月16日 13:21