C# SQLite与实体框架6“;没有这样的表格”;
我尝试先用SQLite和entityframework6代码实现。我可以创建数据库,并且有一个文件(虽然是空的),但是当我尝试向数据库添加条目时,它会说没有这样的表。然而,当我尝试手动创建表时(C# SQLite与实体框架6“;没有这样的表格”;,c#,entity-framework,sqlite,C#,Entity Framework,Sqlite,我尝试先用SQLite和entityframework6代码实现。我可以创建数据库,并且有一个文件(虽然是空的),但是当我尝试向数据库添加条目时,它会说没有这样的表。然而,当我尝试手动创建表时(db.Database.ExecuteSqlCommand(“创建表等”)),它告诉我表已经存在 我已经发现了一些关于这方面的问题,但它们都是关于路径不是绝对的,这里根本不是这样 上下文 //上下文: 类MediaContext:DbContext { 公共数据库集媒体{get;set;} 公共Media
db.Database.ExecuteSqlCommand(“创建表等”)
),它告诉我表已经存在
我已经发现了一些关于这方面的问题,但它们都是关于路径不是绝对的,这里根本不是这样
上下文
//上下文:
类MediaContext:DbContext
{
公共数据库集媒体{get;set;}
公共MediaContext(字符串文件名):基本(新SQLiteConnection(){
连接字符串=
新的SQLiteConnectionStringBuilder()
{DataSource=filename,ForeignKeys=false}
.连接字符串
},对)
{
}
}
达尔
//在DAL中:
公共数据访问层(字符串路径)
{
_path=path.GetFullPath(path);//用于EF6的SQLite提供程序不支持代码优先/迁移工作流,因此您必须在EF6工作流之外手动创建数据库。正如ErikEJ所说,SQLite在我使用它的方式中不支持代码优先,显然它有一个严格的命名策略
为了使这一切正常工作,我必须手动创建表,并使上下文适应命名模式(Media
=>MediaModels
)
上下文
这段代码仍然不完美,我会在改进它的同时尝试更新这个答案。这篇文章启发了我使用代码优先的方法:
诀窍是在上下文构造函数中重新创建对的调用:
public MediaContext()
{
Database.EnsureCreated();
}
关于表名与属性名的匹配:
您可以使用表
属性使工作正常:
public DbSet<MediaModel> Media { get; set; }
我正在使用.NET核心和EntityFramework核心2以及SQLite的代码优先迁移。
在OnModelCreating
中指定表名有助于解决此问题:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<File>()
.ToTable(typeof(File).Name + "s") // <-- the argument could be just "Files"
.HasKey(lf => new { lf.MachineName, lf.PathName });
base.OnModelCreating(modelBuilder);
}
OnModelCreating
将覆盖在TableAttribute
中指定的表名(如果两者都指定)。这是建议的答复:
Visual Studio在运行.NET时使用了不一致的工作目录
核心控制台应用程序。(参见dotnet/project system#3619)这会导致
引发异常:没有这样的表:Blogs。
更新工作表
目录:
在项目上单击鼠标右键,然后选择“编辑项目文件”
在TargetFramework属性的正下方,添加以下内容:
$(MSBuildProjectDirectory)
保存文件
现在您可以运行该应用程序:
调试>无调试启动
这并没有改变我的问题。:/尝试使用SQLite浏览器应用程序查看表是否确实存在,以及它是否具有正确的模式。如果我用记事本++打开文件,它是完全空的(0kB)。我曾经设法创建了它,但我无法再复制它(因此我无法检查该文件)。然后它有8kB,填充了很多NUL字符。所以我想这是创建和保存表的问题,但正如问题中提到的,我也不能手动创建它。我尝试了,甚至检查了你的注释作为答案,但是,尽管我现在文件中有数据,并且它似乎填充了正常的查询,但我仍然不能它和以前的错误是一样的:“没有这样的表:MediaModels”。困扰我的是,在任何地方我甚至都没有要求一个“MediaModels”“表。我的上下文可能有问题吗?您可能需要使用fluent mapping api在上下文中显式指定表名,或者表attributeEnsureCreated对于核心版本是独占的,但如果您使用新SqliteConnection的迁移(“数据源=:内存:”)连接之后,迁移将被忽略,您必须使用“Database.EnsureCreated()”。非常抱歉,这不起作用。问题仍然存在。中的注释相同,但不起作用
public DbSet<MediaModel> MediaModels { get; set; }
public DataAccessLayer(string path)
{
_path = Path.GetFullPath(path);
_connectionPath = _path + @"\MyDatabase.sqlite";
using (var db = new MediaContext(_connectionPath))
{
db.Database.ExecuteSqlCommand("CREATE TABLE IF NOT EXISTS 'MediaModels' ('Name' TEXT, 'FilePath' TEXT NOT NULL PRIMARY KEY, 'Tags' TEXT, 'Note' TEXT, 'FileExtension' TEXT)");
db.SaveChanges();
}
}
public void Generate()
{
using (var db = new MediaContext(_connectionPath))
{
db.MediaModels.Add(new MediaModel("test"));
db.SaveChanges();
}
}
public MediaContext()
{
Database.EnsureCreated();
}
public DbSet<MediaModel> Media { get; set; }
[Table("MediaModel")]
public class MediaModel
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<File>()
.ToTable(typeof(File).Name + "s") // <-- the argument could be just "Files"
.HasKey(lf => new { lf.MachineName, lf.PathName });
base.OnModelCreating(modelBuilder);
}
[Table("Files")]
public class File
{
// ...
}