【发布时间】:2019-12-23 21:52:00
【问题描述】:
我在 vs2019 解决方案中有 3 个项目,它们应该使用使用 Entity Framework Core 的相同 sqlite 数据库。
第一个项目:包含所有数据库模型、数据库上下文、数据库存储库和迁移的 .net 核心类库。
第二个项目:一个 .net 核心控制台应用程序,它需要扫描文件、从 inet 检索元数据并使用检索到的内容为数据库播种。这是通过引用第一个项目并使用存储库访问数据库来完成的。
第三个项目:一个 Asp.net 核心 Webapi,它需要接受来自同一数据库的检索、更新等数据的客户端请求。这也可以通过引用第一个项目并使用存储库来完成。这个项目是主项目,需要的时候需要启动第二个项目。
所有项目都需要能够安装在面向 Windows、MacOS 和 Linux 的客户端计算机上。并且是自托管的。它必须像 Plex、Emby 和 Calibre 一样的内容服务器。
我的问题是如何创建数据源选项字符串以便能够使用相同的 db 文件并将该文件复制到 Asp.net 核心 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>();
}
当我使用实体框架从第一个项目中的迁移创建数据库时,它会在第一个项目的主文件夹中创建 Chapter.db 文件。
在我的 Asp.net Webapi 项目中,我有这个使用数据库:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite("Data Source=Chapter.db"));
我需要这行代码还是可以使用第一个项目中的存储库类?
当我构建解决方案时,我将所有项目的 dll 放在第三个项目的调试文件夹中,但没有 chapter.db 数据库文件。
在构建以进行调试和发布时,如何将 db 文件自动复制到正确的项目输出目录中?
我需要为 Datasource= 连接字符串使用什么来确保在人们安装应用程序后它以 db 文件为目标(在 windows、linux 和 macos 中)?
我已经阅读了两个要使用的类似问题的答案:
Var SqlitePath = Path.combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
@"<YourAppName>\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();
这些答案是否具有相同的结果?我是否可以在 asp.net 核心项目以及 .net 核心控制台应用程序中使用其中之一?
这是否适用于跨平台?
【问题讨论】:
标签: c# .net asp.net-core .net-core entity-framework-core