.net core 如何在F#中使用内存数据库中的实体框架?

.net core 如何在F#中使用内存数据库中的实体框架?,.net-core,f#,entity-framework-core,in-memory-database,.net Core,F#,Entity Framework Core,In Memory Database,我尝试将实体框架核心与F#结合使用,并将内存数据库用于一个非常简单的用例: 开放系统 打开Microsoft.EntityFrameworkCore 类型位置={ X:双人 Y:双份 } 机场类型={ Id:Guid 名称:string 职位:职位 } 类型MyContext= 继承DbContext new()={inherit DbContext()} 新建(选项:DbContextOptions)={继承DbContext(选项)} 覆盖配置选项生成器上的= 如果optionsBuilde

我尝试将实体框架核心与F#结合使用,并将内存数据库用于一个非常简单的用例:

开放系统
打开Microsoft.EntityFrameworkCore
类型位置={
X:双人
Y:双份
}
机场类型={
Id:Guid
名称:string
职位:职位
}
类型MyContext=
继承DbContext
new()={inherit DbContext()}
新建(选项:DbContextOptions)={继承DbContext(选项)}
覆盖配置选项生成器上的=
如果optionsBuilder.IsConfigured为false,则
optionsBuilder.UseInMemoryDatabase(“数据库名称”)|>忽略
[]
val可变机场:DbSet
成员十.机场
使用get()=x
并设置value=x.airports(funx->如果框x=null,则没有其他x)
出租机场(实体:机场)=
使用context=new MyContext()
context.Airports.Add(实体)|>忽略
context.SaveChanges true |>忽略
[]
让主argv=
让机场={
Id=Guid.NewGuid()
Name=“Michelle”
职位={
X=42.0
Y=42.0
}
}
AirportRepository.addAirport机场
0
但它不起作用,并引发以下异常:

Unhandled Exception: System.InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application se
rvice provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
   at Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, IDbContextOptions contextOptions, DbContext context)
   at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
   at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
   at Microsoft.EntityFrameworkCore.DbContext.EntryWithoutDetectChanges[TEntity](TEntity entity)
   at Microsoft.EntityFrameworkCore.DbContext.SetEntityState[TEntity](TEntity entity, EntityState entityState)
   at Program.AirportRepository.addAirport(Airport entity) in C:\Users\eperret\RiderProjects\FSharpCore\FSharpCore\Program.fs:line 43
   at Program.main(String[] argv) in C:\Users\eperret\RiderProjects\FSharpCore\FSharpCore\Program.fs:line 56
未处理的异常:System.InvalidOperationException:未为此DbContext配置任何数据库提供程序。可以通过重写DbContext.onconfig方法或在应用程序se上使用AddDbContext来配置提供程序
服务提供者。如果使用AddDbContext,那么还要确保DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基本构造函数。
在Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider、IDbContextOptions contextOptions、DbContext context)
在Microsoft.EntityFrameworkCore.DbContext.get\u InternalServiceProvider()中
在Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()中
在Microsoft.EntityFrameworkCore.DbContext.EntryWithoutDetectChanges[TEntity](TEntity entity)
位于Microsoft.EntityFrameworkCore.DbContext.SetEntityState[TEntity](TEntity实体,EntityState EntityState)
在C:\Users\eperret\RiderProjects\FSharpCore\FSharpCore\Program.fs中的Program.AirportRepository.addAirport(机场实体):第43行
在C:\Users\eperret\RiderProjects\FSharpCore\FSharpCore\Program.fs中的Program.main(字符串[]argv)处:第56行

如何使其工作,OnConfigurang override存在,因此我并不是这里真正缺少的东西。

猜测一下,我想知道这一行是否是罪魁祸首:

if optionsBuilder.IsConfigured <> false then
            optionsBuilder.UseInMemoryDatabase("database_name") |> ignore
如果optionsBuilder.IsConfigured为false,则
optionsBuilder.UseInMemoryDatabase(“数据库名称”)|>忽略

对于每个
DbContext
实例,
OnConfiguring
只应由EFCore调用一次,因此您可能不需要在此处检查
IsConfigured
。如果分支,请尝试删除该分支,然后重试?

出现一些问题:

  • 正如Matthew Abbott所指出的,
    onconfigurang
    方法没有正确实现,需要检查是否尚未配置(与我最初的做法不同)
  • 似乎我只需要在实体定义中有简单的类型,而不需要复杂的类型(因为这将被视为另一个实体)
解决方案:

开放系统
打开Microsoft.EntityFrameworkCore
[]
机场类型={
Id:Guid
名称:string
X:双人
Y:双份
}
类型MyContext=
继承DbContext
new()={inherit DbContext()}
新建(选项:DbContextOptions)={继承DbContext(选项)}
覆盖配置选项生成器上的=
如果optionsBuilder.IsConfigured为true,则
optionsBuilder.UseInMemoryDatabase(“数据库名称”)|>忽略
[]
val可变机场:DbSet
成员十.机场
使用get()=x
并设置value=x.airports(funx->如果框x=null,则没有其他x)
出租机场(实体:机场)=
使用context=new MyContext()
context.Airports.Add(实体)|>忽略
context.SaveChanges true |>忽略
[]
让主argv=
让myGuid=Guid.NewGuid()
让机场={
Id=myGuid
Name=“Michelle”
X=42.0
Y=42.0
}
AirportRepository.addAirport机场
让thisAirport=AirportRepository.getAirport myGuid
断言(thisAirport=某个机场)
0