C# 如何在不同的表中写入FK值?C | SQLite

C# 如何在不同的表中写入FK值?C | SQLite,c#,winforms,sqlite,dapper,C#,Winforms,Sqlite,Dapper,我正在一个学校项目中工作,我正在创建一个客户管理系统。由于一个需求,我被要求将我的数据库模式从使用1表更改为使用2表。目前,我能够写入数据库中的两个表,但是,我很难理解外键的概念。我的SQL经验非常有限。我当前的execute语句正在写入两个我的表,MedicalInformation表中的客户机ID列除外。它显示为空,我不确定我应该如何从这里开始 cnn.Execute("INSERT INTO ClientInformation (FirstName, MiddleInitial,

我正在一个学校项目中工作,我正在创建一个客户管理系统。由于一个需求,我被要求将我的数据库模式从使用1表更改为使用2表。目前,我能够写入数据库中的两个表,但是,我很难理解外键的概念。我的SQL经验非常有限。我当前的execute语句正在写入两个我的表,MedicalInformation表中的客户机ID列除外。它显示为空,我不确定我应该如何从这里开始

cnn.Execute("INSERT INTO ClientInformation (FirstName, MiddleInitial, LastName, Phone, Email, Address, City, State, Zip, DateOfBirth, Occupation, Employer, EmergencyContact, EmergencyContactRelationship, EmergencyContactPhone) " +
            "VALUES (@FirstName, @MiddleInitial, @LastName, @Phone, @Email, @Address, @City, @State, @Zip, @DateOfBirth, @Occupation, @Employer, @EmergencyContact, @EmergencyContactRelationShip, @EmergencyContactPhone)", client);


cnn.Execute("INSERT INTO MedicalInformation (CurrentMedications, ChronicPain, ChronicPainWhere, OrthopedicPain, OrthopedicPainWhere, Pregnant, PreferedPressureLight, PreferedPressureMedium, PreferedPressureDeep, Allergies, AllergiesWhat, Cancer, HeadacheMigraine, Arthritis, Diabetes, JointReplacement, HighLowBloodPressure, Neuropathy, Fibromyalgia, Stroke, HeartAttack, KidneyDysfunction, BloodClots, Numbness, SprainsStrains, AreasOfDiscomfort) " +
            "VALUES (@CurrentMedication, @ChronicPain, @ChronicPainWhere, @OrthopedicPain, @OrthopedicPainWhere, @Pregnant, @PeferredPressureLight, @PeferredPressureMedium, @PeferredPressureDeep, @Allergies, @AllergiesWhat, @Cancer, @HeadacheMigraine, @Arthritis, @Diabetes, @JointReplacement, @HighLowBloodPressure, @Neuropathy, @Fibromyalgia, @Stroke, @HeartAttack, @KidneyDysfunction, @BloodClots, @Numbness, @SprainsStrains, @AreasOfDiscomfort) ", client.MedicalInfo);
这是表格的一部分

CREATE TABLE "MedicalInformation" (
    "_ID"   INTEGER NOT NULL UNIQUE,
    "Client_ID" INTEGER,
    
    PRIMARY KEY("_ID" AUTOINCREMENT),
    FOREIGN KEY("Client_ID") REFERENCES "ClientInformation"("Client_Id")
);

CREATE TABLE "ClientInformation" (
    "Client_Id" INTEGER NOT NULL UNIQUE,
   
    PRIMARY KEY("Client_Id" AUTOINCREMENT)
);
我的clientinfo类

public class ClientInformation
    {
        //Client Information
        public int Client_ID { get; set; }
        public string FirstName { get; set; }
        public string MiddleInitial { get; set; }
        public string LastName { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
        public string DateOfBirth { get; set; }
        public string Occupation { get; set; }
        public string Employer { get; set; }
        public string EmergencyContact { get; set; }
        public string EmergencyContactRelationship { get; set; }
        public string EmergencyContactPhone { get; set; }
        public MedicalInformation MedicalInfo { get; set; }
        public ClientInformation(string firstname, string middleinitial, string lastname, string phone, string email, string address, string city, string state, string zip, string dateofbirth, string occupation, string employer,
        string emergencycontact, string emergencycontactrelationship, string emergencycontactphone, MedicalInformation clientMedicainfo)
        {
            this.FirstName = firstname;
            this.MiddleInitial = middleinitial;
            this.LastName = lastname;
            this.Phone = phone;
            this.Email = email;
            this.Address = address;
            this.City = city;
            this.State = state;
            this.Zip = zip;
            this.DateOfBirth = dateofbirth;
            this.Occupation = occupation;
            this.Employer = employer;
            this.EmergencyContact = emergencycontact;
            this.EmergencyContactRelationship = emergencycontactrelationship;
            this.EmergencyContactPhone = emergencycontactphone;
            this.MedicalInfo = clientMedicainfo;
        }

    }
由于您的ClientInformation.Client_Id密钥是由SQLite自动生成的,因此在插入MedicalInformation表之前,您需要以某种方式检索它

我没有使用SQLite的经验,但通过快速浏览,我发现可以使用last_insert_rowid函数来检索最后一行insert的ID

您需要在Client.MedicalInfo对象中使用此Client_ID值以供以后处理,因此我认为可以执行以下操作:

client.MedicalInfo.client_ID=cnn.executescalarin插入客户信息FirstName、MiddleInitial、LastName、电话、电子邮件、地址、城市、州、邮政编码、出生日期、职业、雇主、紧急联系人、紧急联系人关系、紧急联系人电话+ 值@FirstName、@MiddleInitial、@LastName、@Phone、@Email、@Address、@City、@State、@Zip、@DateOfBirth、@accountry、@EmergencyContact、@EmergencyContactRelationShip、@EmergencyContactPhone+ 选择最后一个\u插入\u rowid;,客户 cnn.ExecuteINSERT进入医疗信息客户ID,当前药物,慢性疼痛,慢性疼痛哪里,骨科疼痛,骨科疼痛哪里,怀孕,首选压力灯,首选压力中等,首选压力EP,过敏,过敏什么,癌症,头痛偏头痛,关节炎,糖尿病,关节置换,高血压,神经病,纤维肌痛、中风、心脏病发作、肾功能不全、血栓、麻木、扭伤、不适区域+ 价值观@Client_ID、@currentmedicing、@ChronicPain、@ChronicPainWhere、@矫形外科疼痛、@矫形外科疼痛where、@怀孕、@PeferredPressureLight、@PeferredPressureMedium、@peferredpressureDep、@Allergies、@AllergiesWhat、@Cancer、@headache migraine、@Arthritis、@Diabetes、@JointReplacement、@highlowblood、@neurophy、@纤维肌痛、,中风、心脏病发作、肾功能不全、血块、麻木、扭伤、不适等,client.MedicalInfo;
只需确保您的DTO类中存在client.MedicalInfo.client_ID属性。

我已经尝试了您所说的,现在只将0写入数据库。请尝试第二个选项。我不确定SQLite在内部是如何工作的,但它可能会丢弃第一次插入的存储值,因为您正在运行两个独立的Execute语句,因此需要将其存储在对象中。我已经从我的答案中删除了第一个选项,这样你就不会对同样的事情感到困惑。它正在写一个0。我在上面添加了clientinfo类哦,对不起,我误解了你的类结构。由于将client.MedicalInfo作为参数传递给第二个insert,因此ExecuteScalar的返回值应存储在MedicalInformation类中的属性中。您将把ExecuteScalar的返回值分配给client.MedicalInfo.client\u ID,而不是client.client\u ID。我已再次更新了答案。告诉我它现在是否终于起作用了你对我的帮助比你知道的要多=