2017-09-26 112 views
3

这里我再次寻求帮助。 :) 我试图插入数据到我的MySQL数据库使用F#。 我的模式包括3个表(实验,基因及其结果):在所有表中的MySQL数据库中插入数据

Experiments   |  Results   |  Gene 
Experiment id  |  Experiment id  |  Gene id 
Experiment name  |  Gene id   |  Gene Name       
        |  Value    | 

现在,我试图将数据添加到使用sqlProvider的分贝。

let db = sql.GetDataContext() 

let gene_tb = db.Vp32.Genes 
let exp_tb = db.Vp32.Experiments 
let results_tb = db.Vp32.Results 

let createNewInput (genename: string) (expname: string) res = 
    let newRes = results_tb.Create() 
    let newGene = gene_tb.Create() 
    let newExp = exp_tb.Create() 

    newGene.GeneName <- genename 
    newExp.ExpName <- expname 
    newRes.ResultVal <- Some res 

createNewInput "test1" "experiment_test1" (float32 999.5) 

db.SubmitUpdates() 

我有问题,使其明白结果值链接到实验和基因IDS。当我尝试提交时出错: “字段'Exp_id'没有默认值”。那么,没有默认值,因为它应该是其他表的ID。哦,并且..这些ID设置为自动增加。此外,每次添加新数据时,如果实验名称已存在于表中,则不应增加该ID。我是否必须使用'if ... then'来为此或某些规范代码做'触发器'?

非常感谢您提前! :D 感谢你我已经学会了很多阿尔雷,我不敢相信!^-^

解决方案:所以,我发现问题是我必须查询实验和基因的ID ..所以我改变了一些东西。现在我有3个功能(每个表)和一个结果将结果值之前做一个小的查询:

let addNewExp (expname: string)= 
    let newExp = exp_tb.Create() 
    newExp.ExpName <- expname 
    db.SubmitUpdates() 

let addNewGene (genename: string)= 
    let newGene = gene_tb.Create() 
    newGene.GeneName <- genename 
    db.SubmitUpdates() 

let addNewRes (expName: string) (geneName: string) res = 
    let tempExpId = 
     query { 
      for experiment in exp_tb do 
       where (experiment.ExpName = expName) 
       select experiment.ExpId 
      } 
     |> Seq.head 

    let tempGeneId = 
     query { 
      for gene in gene_tb do 
       where (gene.GeneName = geneName) 
       select gene.GeneName 
      } 
     |> Seq.toArray |> String.concat "" 

    let newRes = results_tb.Create() 
    newRes.ExpId <- tempExpId 
    newRes.GeneId <- tempGeneId 
    newRes.ResultVal <- Some res 
    db.SubmitUpdates() 

事实上,这是必做的查询增加一些之前得到的ID值在关联表(结果)中。之后,我只是转换为正确的类型(在数据库中描述),因为查询返回为序列(Seq)。 我希望这可以帮助未来的人。

回答

2

我还没有真正尝试过这一点,所以它可能不会是正确的 - 但我认为一个战略,应努力将首先与Gene纪录GeneName插入Experiment记录(与ExpName)在一起。

当您再拨打SubmitUpdates时,提供商应该插入两条记录(这些记录应该有效,因为它们具有所需的所有字段)并填充插入记录的Experiment idGene id属性。

然后您将拥有这些ID,因此您应该尝试使用所有正确的ID创建一个新的Result记录,然后插入它并再次呼叫SubmitUpdates

(可能有更好的方法,但这可能会诀窍...)

+0

好吧,谢谢你分享你的想法! :)我试图去这种方式,但现在我得到“未更改的实体遇到更新列表 - 这应该是不可能的!”。 >。< –

+0

@IsabellaNavarro听起来不太好!你可以编辑你的问题,并包括更新的代码? –