Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite与实体框架6“;没有这样的表格”;_C#_Entity Framework_Sqlite - Fatal编程技术网

C# SQLite与实体框架6“;没有这样的表格”;

C# SQLite与实体框架6“;没有这样的表格”;,c#,entity-framework,sqlite,C#,Entity Framework,Sqlite,我尝试先用SQLite和entityframework6代码实现。我可以创建数据库,并且有一个文件(虽然是空的),但是当我尝试向数据库添加条目时,它会说没有这样的表。然而,当我尝试手动创建表时(db.Database.ExecuteSqlCommand(“创建表等”)),它告诉我表已经存在 我已经发现了一些关于这方面的问题,但它们都是关于路径不是绝对的,这里根本不是这样 上下文 //上下文: 类MediaContext:DbContext { 公共数据库集媒体{get;set;} 公共Media

我尝试先用SQLiteentityframework6代码实现。我可以创建数据库,并且有一个文件(虽然是空的),但是当我尝试向数据库添加条目时,它会说没有这样的表。然而,当我尝试手动创建表时(
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
    {
        // ...
    }