EF 5RC表分为两个以上的实体 [英] EF 5RC Table splitting into more than two entities

查看:120
本文介绍了EF 5RC表分为两个以上的实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以提供一个例子,或说明如何使用EF 5 RC Code First上的数据注释将表拆分成两个以上的实体?



我有4个实体我想映射成一个表。每个代码的代码是:

  [Table(PatientDataEntities)] 
public class PatientDataEntity
{
[Key]
[ForeignKey(UserFullName)]
public virtual Guid Id {get;组; }

public virtual UserFullNameEntity UserFullName {get;组; }

public virtual GeneralData GenData {get; set;}

[ForeignKey(Id)]
public virtual PersonalPatientDataEntity PersonalData {get;组; }

[ForeignKey(Id)]
public virtual MedicalPatientDataEntity MedicalData {get;组; }

[ForeignKey(Id)]
public virtual FinancialPatientDataEntity FinancialData {get;组;

}

[Table(PatientDataEntities)]
public class PersonalPatientDataEntity
{
[Key]
[ ForeignKey(UserFullName)]
public virtual Guid Id {get;组; }

public virtual UserFullNameEntity UserFullName {get;组; }

[ForeignKey(Id)]
public virtual MedicalPatientDataEntity MedicalPatientData {get;组; }

[ForeignKey(Id)]
public virtual FinancialPatientDataEntity FinancialPatientData {get;组; }

[ForeignKey(Id)]
public virtual PatientDataEntity PatientData {get;组; }

[DataType(DataType.DateTime)]
public virtual DateTime Birthdate {get;组; }

public virtual性别性别{get;组; }

public virtual MaritalStatus MStatus {get;组; }

public virtual byte儿童{get;组; }

public virtual string教育{get;组; }

public string专业{get;组; }

}


[Table(PatientDataEntities)]
public class MedicalPatientDataEntity
{
[Key]
[ForeignKey(UserFullName)]
public virtual Guid Id {get;组; }

public virtual UserFullNameEntity UserFullName {get;组; }

[ForeignKey(Id)]
public virtual PersonalPatientDataEntity PersonalData {get;组; }

[ForeignKey(Id)]
public virtual FinancialPatientDataEntity FinancialData {get;组; }

[ForeignKey(Id)]
public virtual PatientDataEntity PatientData {get;组; }

public virtual string ClinicalHistoryNumber {get;组; }

public virtual BiologicalState State {get;组; }

public virtual Guid PhysicianId {get;组; }

public virtual DateTime? RegisterDate {get;组; }

public virtual bool AcceptsDataTreatment {get;组; }

public virtual bool AcceptsImageTreatment {get;组; }

public virtual / * List< Allergy> * / string过敏{get;组; }

public virtual / * List< Surgery> * / string Surgeries {get;组; }

public virtual / * List< Medication> * / string Medications {get;组; }

public virtual / * List< MedicalPrecedent> * / string MedicalPrecedents {get;组; }

[DataType(DataType.MultilineText)]
public virtual string Family {get;组; }

public virtual string Nicotinism {get;组;

public virtual float?体重{get;组;

public virtual float?身高{get;组;

[NotMapped]
public virtual float? BodyMassIndex {get;组; }

public virtual string注释{get;组;



[表(PatientDataEntities)]
public class FinancialPatientDataEntity
{
[Key]
[ ForeignKey(UserFullName)]
public virtual Guid Id {get;组; }

public virtual UserFullNameEntity UserFullName {get;组; }

[ForeignKey(Id)]
public virtual PersonalPatientDataEntity PersonalData {get;组; }

[ForeignKey(Id)]
public virtual MedicalPatientDataEntity MedicalData {get;组; }

[ForeignKey(Id)]
public virtual PatientDataEntity PatientData {get;组; }

public virtual string KindOfPatient {get;组; }

public virtual string Isapre {get;组; }

}

我的上下文是这样的:

  public class MedicDbContext:DbContext 
{
public DbSet< UserFullNameEntity> UsersFullName {get;组; }
public DbSet< MedicDb.Patient.PatientDataEntity> PatientDataEntities {get;组; }

public DbSet< MedicDb.Patient.Personal.PersonalPatientDataEntity> PersonalPatientDataEntities {get;组; }

public DbSet< MedicDb.Patient.Financial.FinancialPatientDataEntity> FinancialPatientDataEntities {get;组; }

public DbSet< MedicDb.Patient.Medical.MedicalPatientDataEntity> MedicalPatientDataEntities {get;组;
}

当我运行时收到以下异常:



EntityFramework.DLL中出现类型为System.InvalidOperationException的异常,但未在用户代码中处理



附加信息:无法确定
之间的
关联的主体结束
'MedicDb.Patient.Medical.MedicalPatientDataEntity'和
'MedicDb.Patient.Personal .PersonalPatientDataEntity。必须使用
关系流畅的API或数据注释来明确地配置此关联的主体
结尾。


我在这里做错了什么?我真的需要一些帮助。

解决方案

嗯,我解决了这个问题,我想主要原因是我对这个话题的无知,[ForeignKey]属性必须只在关系的一端,修复异常,但是要使4个实体在同一个表上,它们之间必须有一对一的关系,它看起来有点不自然但这是唯一的工作方式。所以,最后我没有分割我的表,而是创建4个分离的表,其中一个对一个关系不在其中4个之间,而是在PatientDataEntity和其他3之间的每个之间,这是通过删除[ ForeingKey]来自PatientDataEntity中的属性的注释,但将它们留在其他3个实体上(导航属性为PatientDataEntity。
这就是所有的
如果别人遇到同样的问题, p>

感谢所有



Juan Carlos Galvez


Can someone provide an example or explain how can I split a table into more than two entities using data annotations on EF 5 RC Code First?

I have 4 entities I want to be mapped into just one table. The code for each one of them are:

[Table("PatientDataEntities")]
public class PatientDataEntity
{
    [Key]
    [ForeignKey("UserFullName")]
    public virtual Guid Id { get; set; }

    public virtual UserFullNameEntity UserFullName { get; set; }

    public virtual GeneralData GenData {get; set;}

    [ForeignKey("Id")]
    public virtual PersonalPatientDataEntity PersonalData { get; set; }

    [ForeignKey("Id")]
    public virtual MedicalPatientDataEntity MedicalData { get; set; }

    [ForeignKey("Id")]
    public virtual FinancialPatientDataEntity FinancialData { get; set; }

} 

[Table("PatientDataEntities")]
public class PersonalPatientDataEntity
{
    [Key]
    [ForeignKey("UserFullName")]
    public virtual Guid Id { get; set; }

    public virtual UserFullNameEntity UserFullName { get; set; }

    [ForeignKey("Id")]
    public virtual MedicalPatientDataEntity MedicalPatientData { get; set; }

    [ForeignKey("Id")]
    public virtual FinancialPatientDataEntity FinancialPatientData { get; set; }

    [ForeignKey("Id")]
    public virtual PatientDataEntity PatientData { get; set; }

    [DataType(DataType.DateTime)]
    public virtual DateTime Birthdate { get; set; }

    public virtual Gender Sex { get; set; }

    public virtual MaritalStatus MStatus { get; set; }

    public virtual byte Children { get; set; }

    public virtual string Education { get; set; }

    public string Profession { get; set; }

} 


[Table("PatientDataEntities")]
public class MedicalPatientDataEntity
{
    [Key]
    [ForeignKey("UserFullName")]
    public virtual Guid Id { get; set; }

    public virtual UserFullNameEntity UserFullName { get; set; }

    [ForeignKey("Id")]
    public virtual PersonalPatientDataEntity PersonalData { get; set; }

    [ForeignKey("Id")]
    public virtual FinancialPatientDataEntity FinancialData { get; set; }

    [ForeignKey("Id")]
    public virtual PatientDataEntity PatientData { get; set; }

    public virtual string ClinicalHistoryNumber { get; set; }

    public virtual BiologicalState State { get; set; }

    public virtual Guid PhysicianId { get; set; }

    public virtual DateTime? RegisterDate { get; set; }

    public virtual bool AcceptsDataTreatment { get; set; }

    public virtual bool AcceptsImageTreatment { get; set; }

    public virtual /*List<Allergy>*/ string Allergies { get; set; }

    public virtual /*List<Surgery>*/ string Surgeries { get; set; }

    public virtual /*List<Medication>*/ string Medications { get; set; }

    public virtual /*List<MedicalPrecedent>*/ string MedicalPrecedents { get; set; }

    [DataType(DataType.MultilineText)]
    public virtual string Family { get; set; }

    public virtual string Nicotinism { get; set; }

    public virtual float? Weight { get; set; }

    public virtual float? Height { get; set; }

    [NotMapped]
    public virtual float? BodyMassIndex { get; set; }

    public virtual string Remarks { get; set; }
} 


[Table("PatientDataEntities")]
public class FinancialPatientDataEntity
{
    [Key]
    [ForeignKey("UserFullName")]
    public virtual Guid Id { get; set; }

    public virtual UserFullNameEntity UserFullName { get; set; }

    [ForeignKey("Id")]
    public virtual PersonalPatientDataEntity PersonalData { get; set; }

    [ForeignKey("Id")]
    public virtual MedicalPatientDataEntity MedicalData { get; set; }

    [ForeignKey("Id")]
    public virtual PatientDataEntity PatientData { get; set; }

    public virtual string KindOfPatient { get; set; }

    public virtual string Isapre { get; set; }

} 

And my context is this:

public class MedicDbContext : DbContext
{
    public DbSet<UserFullNameEntity> UsersFullName { get; set; }
    public DbSet<MedicDb.Patient.PatientDataEntity> PatientDataEntities { get; set; }

    public DbSet<MedicDb.Patient.Personal.PersonalPatientDataEntity> PersonalPatientDataEntities { get; set; }

    public DbSet<MedicDb.Patient.Financial.FinancialPatientDataEntity> FinancialPatientDataEntities { get; set; }

    public DbSet<MedicDb.Patient.Medical.MedicalPatientDataEntity> MedicalPatientDataEntities { get; set; }
} 

When I run that I receive the following exception:

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.DLL but was not handled in user code

Additional information: Unable to determine the principal end of an association between the types 'MedicDb.Patient.Medical.MedicalPatientDataEntity' and 'MedicDb.Patient.Personal.PersonalPatientDataEntity'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

What am I doing wrong here? I really need some help here.

解决方案

Well, I fixed the problem, I guess the main cause is my ignorance on the topic, the [ForeignKey] attribute must be at just one end of the relation, that fix the exception but to make the 4 entities be on the same table there must be a one to one relation between the 4 of them, it looks a bit unnatural but that's the only way it works. So, at the end I'm not splitting my table but, instead, creating 4 separated tables having one to one relation not among the 4 of them but between the PatientDataEntity and each one of the other 3, that is done by removing the [ForeingKey] annotation from the properties in PatientDataEntity but leaving them on the other 3 entities (on the navigation properties toward PatientDataEntity. That´s all. That in case orther people arrives at the same problem.

Thanks to all

Juan Carlos Galvez

这篇关于EF 5RC表分为两个以上的实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆