作为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
问题是,子代码表不是由代码生成的。我期待创建表,定义外键,填充值。
答案 0 :(得分:2)
EF将在您第一次运行时为您创建一个数据库,但更改为模型的结构将不会通过迁移传播到数据库。通常,这意味着从包管理器控制台运行一些额外的命令,这些命令生成代码和其他命令以针对数据库运行这些模型更新。鉴于生成的代码可能是C#,这可能会导致您的F#应用程序出现问题。
如果您仍处于早期阶段,并且不关心您的数据是否被删除,则删除数据库并让EF重新创建它将使您的架构更新。
在类似情况下,我提出了:
d.Database.CreateIfNotExists() |> ignore
我的代码早期的某个地方强制它在我删除它之后创建,但我实际上并不记得是否需要它。
我确信有更好的教程,但this link显示了如何在C#项目中执行迁移。鉴于Visual Studio不将F#视为一流语言的所有其他地方,我不希望它实际工作,但我很高兴被证明是错误的。
我总是放弃数据库并重新创建它,但我的项目还没有达到目的,也没有那种丢失数据对我来说真正重要的类型。
此外,如果您搜索代码首次迁移的示例并查看代码生成器创建的代码类型,则可以手动编写所有代码。乏味,但可能。但它会将所有代码保存在F#中。