将实体框架核心示例转换为F#

Vit*_*tor 3 c# f# entity-framework

我正在尝试将示例Entity Framework Core转换为F#,但无法翻译BloggingContext该类。

直到现在我写

type BloggingContext() =
inherit DbContext()

member val Blogs = DbSet<Blog>() with get,set
member val Posts = DbSet<Post>() with get,set
Run Code Online (Sandbox Code Playgroud)

这是不完整的,Visual Studio Code抱怨DbSet没有可访问的对象构造函数。除此之外,我不知道如何重写该方法OnConfiguring

Fyo*_*kin 5

由于DbSet<T>没有公共构造函数,因此您无法自己创建它的实例。这个想法是,您只需声明属性作为null初始值,EF 稍后会为它们分配新值。因此,您只需指定 的初始值null即可:

member val Blogs: DbSet<Blog> = null with get,set
Run Code Online (Sandbox Code Playgroud)

要重写方法,请使用override关键字:

override this.OnConfiguring optionsBuilder =
   optionsBuilder.UseSqlServer @"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"
Run Code Online (Sandbox Code Playgroud)

  • 我使用了这个解决方案,但后来我发现了另一个问题。当我创建新的“BloggingContext”实例时,成员博客不会由“DbSet”实例化,因此当我尝试添加新博客时,我收到“System.NullReferenceException”。 (4认同)

Vit*_*tor 5

我使用了Fyodor的答案,但是后来当我尝试向集合中添加新Blog时,我收到了空引用异常。因此,我找到的答案是将Blogs和的声明修改Posts为:

[<DefaultValue>] val mutable m_blogs : DbSet<Blog>
    member public this.Blogs with get() = this.m_blogs 
                                        and set v = this.m_blogs <- v

[<DefaultValue>] val mutable m_posts : DbSet<Post>
    member public this.Posts with get() = this.m_posts 
                                        and set v = this.m_posts <- v
Run Code Online (Sandbox Code Playgroud)

override关键字解决方案工作对我很好!