2

誰かが例を提供したり、EF 5 RC Code First でデータ注釈を使用してテーブルを 2 つ以上のエンティティに分割する方法を説明したりできますか?

1 つのテーブルだけにマップしたい 4 つのエンティティがあります。それぞれのコードは次のとおりです。

[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; }

} 

そして、私の文脈はこれです:

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; }
} 

それを実行すると、次の例外が発生します。

タイプ 'System.InvalidOperationException' の例外が EntityFramework.DLL で発生しましたが、ユーザー コードで処理されませんでした

追加情報: タイプ 'MedicDb.Patient.Medical.MedicalPatientDataEntity' と 'MedicDb.Patient.Personal.PersonalPatientDataEntity' の間の関連付けのプリンシパル エンドを特定できません。この関連付けのプリンシパル エンドは、リレーションシップ fluent API またはデータ アノテーションのいずれかを使用して明示的に構成する必要があります。

ここで何が間違っていますか?ここで本当に助けが必要です。

4

1 に答える 1

2

さて、私は問題を修正しました。主な原因はトピックに関する私の無知であると思います.[ForeignKey]属性は関係の一端にある必要があり、例外を修正しますが、4つのエンティティが同じテーブルにあるようにします4 人が 1 対 1 の関係にある必要があり、少し不自然に見えますが、それが機能する唯一の方法です。したがって、最後にテーブルを分割するのではなく、4 つのテーブルの間ではなく、PatientDataEntity と他の 3 つのテーブルのそれぞれとの間に 1 対 1 の関係を持つ 4 つの分離したテーブルを作成します。 ForeingKey] 注釈は、PatientDataEntity のプロパティから削除されますが、他の 3 つのエンティティ (PatientDataEntity へのナビゲーション プロパティ) に残されます。これですべてです。他の人が同じ問題に遭遇した場合に備えて

ありがとうございます

フアン・カルロス・ガルベス

于 2012-08-09T13:04:47.177 に答える