C# 在asp.net核心项目和具有第三个数据类库项目的.net核心控制台项目之间共享Sqlite数据库

C# 在asp.net核心项目和具有第三个数据类库项目的.net核心控制台项目之间共享Sqlite数据库,c#,.net,asp.net-core,.net-core,entity-framework-core,C#,.net,Asp.net Core,.net Core,Entity Framework Core,我在vs2019解决方案中有3个项目,它们应该使用相同的sqlite数据库,使用Entity Framework Core 第一个项目:一个包含所有数据库模型、数据库上下文、数据库存储库和迁移的.net核心类库 第二个项目:一个.net核心控制台应用程序,它需要扫描文件,从inet检索元数据,并用检索到的内容为数据库种子。这是通过引用第一个项目并使用存储库访问数据库来完成的 public void ConfigureServices(IServiceCollection services) {

我在vs2019解决方案中有3个项目,它们应该使用相同的sqlite数据库,使用Entity Framework Core

第一个项目:一个包含所有数据库模型、数据库上下文、数据库存储库和迁移的.net核心类库

第二个项目:一个.net核心控制台应用程序,它需要扫描文件,从inet检索元数据,并用检索到的内容为数据库种子。这是通过引用第一个项目并使用存储库访问数据库来完成的

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlite("Data Source=Chapter.db"));
第三个项目:一个Asp.net核心Webapi,它需要接受客户端从同一数据库检索、更新等数据的请求。这也可以通过引用第一个项目和使用存储库来完成。该项目是主要项目,需要时需要启动第二个项目

所有项目都需要能够安装在针对Windows、MacOS和Linux的客户机上。并且是自我托管的。它必须像一个内容服务器一样,模拟Plex、Emby和Calibre

我的问题是如何创建datasource选项字符串,以便能够使用相同的db文件并将该文件复制到Asp.net core Webapi项目的位置

现在,在第一个项目中,我的dbcontext文件中有以下内容:

    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

        #region DbSets
        public DbSet<Authors> Authors { get; set; }
        ...
        ...

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {

        public ApplicationDbContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
            builder.UseSqlite("Data Source=Chapter.db");
            return new ApplicationDbContext(builder.Options);
        }
    }
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    private DbContextOptionsBuilder<ApplicationDbContext> _optionsBuilder;
    public ApplicationDbContext _context = null;
    public DbSet<T> table = null;
    public GenericRepository()
    {
        _optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>().UseSqlite("Data Source=Chapter.db");
        this._context = new ApplicationDbContext(_optionsBuilder.Options);
        table = _context.Set<T>();
    }
这些答案有相同的结果吗?我是否能够在asp.net核心项目以及.net核心控制台应用程序中使用其中一个


这是跨平台的吗?

我有点晚了,我想你已经明白了这一点,但我写这个答案是因为它是我的一个谷歌搜索的最佳结果

目前的问题是指向数据库的正确位置

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlite("Data Source=Chapter.db"));
public void配置服务(IServiceCollection服务)
{
services.AddDbContext文档后者似乎有更多的功能,允许通过代码添加密码和其他有趣的东西,而不是手动输入字符串

在这种情况下,绝对路径将有所帮助,因为它允许您指定您正在使用的数据库文件的直接路径。否则,您需要修改连接字符串,以便为每个项目使用相对路径。如果项目移动到文件系统的不同部分,则可能会变得复杂。它仍然可以l完成。例如,如果两个项目位于同一位置,则在数据库名称前添加“./”就足以为所有项目提供相同的位置

使用绝对路径,您只需指定一个类似“C:\Chapter.db”的位置,您的所有项目都将使用该位置的数据库,而不是它们各自的文件

var builder = new SqliteConnectionStringBuilder(connectionString);
builder.DataSource = Path.GetFullPath( Path.Combine(
AppDomain.CurrentDomain.GetData("DataDirectory") as string ?
AppDomain.CurrentDomain.BaseDirectory, builder.DataSource);
connectionString = builder.ToString();
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlite("Data Source=Chapter.db"));
Var SqlitePath = Path.combine(

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
@"<YourAppName>\Chapter.db");