具有实体框架的FSharp记录类型代码优先:嵌套类型

时间:2014-12-28 14:59:06

标签: entity-framework f#

作为this问题的后续问题,我现在想要添加嵌套类型。我使用以下代码创建了嵌套类型:

[<CLIMutable>]
type Child = {[<Key>]Id:int; FirstName:string; Gender:string; Grade:int}

[<CLIMutable>]
type Family = {[<Key>]Id:int; LastName:string; IsRegistered:bool; Children: Child list}

type CLFamily() =
    inherit DbContext()
    [<DefaultValue>]
    val mutable m_families: DbSet<Family>
    [<DefaultValue>]
    val mutable m_children: DbSet<Child>
    member public this.Families with get() = this.m_families
                                and set v = this.m_families <- v
    member public this.Children with get() = this.m_children
                                and set v = this.m_children <- v

let dbFamily = new CLFamily()
let connectionString = "Server=.;Database=FamilyDomain;Trusted_Connection=True;"
dbFamily.Database.Connection.ConnectionString <- connectionString
let family = {Id=0;LastName="Test";IsRegistered=true; 
    Children=[{Id=0; FirstName="Test"; Gender="Male"; Grade=5}];}
dbFamily.Families.Add(family) |> ignore
dbFamily.SaveChanges() |> ignore

问题是,子代码表不是由代码生成的。我期待创建表,定义外键,填充值。

1 个答案:

答案 0 :(得分:2)

EF将在您第一次运行时为您创建一个数据库,但更改为模型的结构将不会通过迁移传播到数据库。通常,这意味着从包管理器控制台运行一些额外的命令,这些命令生成代码和其他命令以针对数据库运行这些模型更新。鉴于生成的代码可能是C#,这可能会导致您的F#应用程序出现问题。

如果您仍处于早期阶段,并且不关心您的数据是否被删除,则删除数据库并让EF重新创建它将使您的架构更新。

在类似情况下,我提出了:

d.Database.CreateIfNotExists() |> ignore

我的代码早期的某个地方强制它在我删除它之后创建,但我实际上并不记得是否需要它。

我确信有更好的教程,但this link显示了如何在C#项目中执行迁移。鉴于Visual Studio不将F#视为一流语言的所有其他地方,我不希望它实际工作,但我很高兴被证明是错误的。

我总是放弃数据库并重新创建它,但我的项目还没有达到目的,也没有那种丢失数据对我来说真正重要的类型。

此外,如果您搜索代码首次迁移的示例并查看代码生成器创建的代码类型,则可以手动编写所有代码。乏味,但可能。但它会将所有代码保存在F#中。