如何以一对一的关系提供患者诊断信息之后插入计费信息

时间:2017-09-30 03:47:58

标签: c# asp.net sql-server webforms one-to-one

我想要的应用程序是医院管理系统。在EnterPatientDiagnosis表格中(截图在最后给出),我需要添加患者的诊断信息,然后我需要添加其相关的计费信息。这里,两个表主键列都是标识列。 这是许多系统中的常见步骤。但我仍然无法找到有关如何实现它的详细信息。

我想到的一个解决方案是插入所有诊断信息,使用存储过程保持FK_billId属性为空,并从存储过程中获取DiagnosisId作为输出参数。然后当用户提交账单信息时,我将使用BillId和DiagnosisId更新诊断表中先前插入的行。但我不喜欢这种方法有两个原因:

首先因为它有一个额外的更新查询。因为,如果我在这2个数据库表而不是BillId之间使用DiagnosisId作为外键,那么就不会是否需要此更新查询。但是我没有找到任何规则/优先权,你应该在一对一的关系中使用哪个Key作为FK。

其次它与我创建的实体类冲突。我已在我的实体层中为这2个表手动创建了2个类。所以,如果我想通过实体层插入行,那么我必须给Billing类一个名为DiagnosisId的新属性,这与我的数据库表模式相矛盾。 这是实体层中的2个类:

public class EntityPatientDiagnosis
{
    //Diagnosis Id is automatically assigned   
    public int DiagnosisId { get; set; }
    public int PatientId { get; set; }


    public string Symptoms { get; set; }
    public string DiagnosisProvided { get; set;}

    public string AdministeredBy { get; set; }

    public DateTime DateofDiagnosis { get; set; }
    public string FollowUpRequired { get; set; }
    public DateTime DateOfFollowUp { get; set; }
    public int BillId { get; set; } //BillId -> Foreign Key 

}

public class EntityBilling
{
    //BillId -> Primary Key ->set automatically
    public int BillId { get; set; } 
    public int BillAmount { get; set; }
    public string CardNumber { get; set; }
    public string ModeOfPayment { get; set; }
}

以下是表格和Web表单的ERD图片: ERD of One-to-One R

Enter Patient Diagnosis Web Form

1 个答案:

答案 0 :(得分:1)

您可以尝试不同的方法。您可以更改实体PatientDiagnosis和Billing之间的关系。因此,首先您可以创建PatientDiagnosis条目,然后为其创建一个Billing条目。

select 
    id, STD_ID, SUB_ID, ASG_MARK, TH_MARKS, PR_MARCHAR,
    (ASG_MARK + TH_MARKS + PR_MARCHAR ) as total,
    CASE 
       WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 91 AND 100 
          THEN 'A1' 
       WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 81 AND 90 
          THEN 'B1' 
       WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 71 AND 80 
          THEN 'C1' 
       WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 61 AND 70 
          THEN 'D1' 
       WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 51 AND 60 
          THEN 'E1'
       WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 41 AND 50 
          THEN 'F1' 
       ELSE 'AB'
    END AS GRADE
from  
    (select 
         id, STD_ID, SUB_ID, 
         case ISNUMERIC(PR_MARCHAR) 
            when 1 then CAST(PR_MARCHAR as decimal) 
            else 0 
         end as PR_MARCHAR,
         case ISNUMERIC(TH_MARKS) 
            when 1 then CAST(TH_MARKS as decimal) 
            else 0 
         end as TH_MARKS ,
         case ISNUMERIC(ASG_MARK) 
            when 1 then CAST(ASG_MARK as decimal) 
            else 0 
         end as ASG_MARK
     from 
         MARKS_ENTRY  
     group by 
         id, STD_ID, SUB_ID, ASG_MARK, TH_MARKS, PR_MARCHAR) MARKS