2016-09-12 22 views
-3

MVCプロジェクトのために、最初にEntity Framework 6.1 &コードを使用しています。複数のnull可能な複合外部キー

public class PackageDaySchedule 
{ 
public int Id {get;set;} 
public DateTime Time {get;set;} 
Public int PackageId {get;set;} 
Public int? PackageCity{get;set;} 
public int? PackageHotelId {get;set;} 
Public int? PackagePlaceToVisitId {get;set;} 
//navigation property 
public virtual Package {get;set;} 
public virtual PackageCity Package City {get;st;} 
public virtual PackageHotel PackageHotel {get;st;} 
public virtual PackagePlaceToVisit PackagePlaceToVisit{get;set;} 
} 

Public class Package { 
Public int PackageId {get;set;} 
Public List<PackageCity> PackageCities {get;set;} 
} 
Public class PackageCity{ 
[Key, Column(Order = 0)] 
Public int PackageId {get;set;} 
[Key, Column(Order = 1)] 
public int CityId {get;set;} 
public List<PackageHotel> PackageHotels {get;set;} 
//virtual properties - Package and City 
} 
Public class PackageHotel{ 
[Key, Column(Order = 0)] 
Public int PackageId {get;set;} 
[Key, Column(Order = 1)] 
public int CityId {get;set;} 
[Key, Column(Order = 2)] 
Public int HotelId {get;set;} 

//virtual properties - Package,City, Hotel 
} 

1つのPackageDayScheduleには、packageCityまたはpackagehotelまたはPackagePlaceToVistが必要です。私の質問は、データアノテーションを使用してPackageDaySheduleテーブルの外部キーを指定する方法です。 PackageIdはPackageCity、PackageHotelに共通です。& PackagePlaceToVistのナビゲーションプロパティ。

+0

まず、コンポジットキーを使用することは、ほとんど常に悪い考えです。第二に、外部キーで構成される複合キーを使用することは、常に*悪い考えです。第3に、ヌル可能な*外部キーで構成される複合キーを使用することは、単に致命的な考えです。通常の 'identity'または' uniqueidentifier'カラムをプライマリ・キーとして使用し、それをdayと呼んでください。 –

+0

なぜこれをMVCに入れますか? –

+0

@ChrisPratt チップには非常に感謝しています。私はあなたのアドバイスに従ってデザインを変更します。 – user3627847

答えて

1

どのようにデータベーステーブルの概要は、ASP MVCモデルで表現されたモデルは、データベーステーブルを表し、私は、データモデルは、最初のコードからデータベースの作成方法を説明します、次のセクションでは

どう

ASP MVCでどのように関係が表現されているかをカバーします。この例では

私たちは、次のスキーマを持つ3つのテーブルがあります。

Studentテーブル

StudentID、姓、姓、EnrollmentDate

コーステーブル

CourseID、タイトルを、クレジット

登録テーブル

EnrollmentID、CourseID、StudentID、グレード

これらのテーブルのそれぞれ1つの別個のモデルで表現されなければなりません。

  1. Studentテーブル

    public partial class Student 
    { 
    
        public int StudentID { get; set; } 
        public string LastName { get; set; } 
        public string FirstName { get; set; } 
        public Nullable<System.DateTime> EnrollmentDate { get; set; } 
    
        public virtual ICollection<Enrollment> Enrollments { get; set; } 
    

    }

パブリック仮想加入契約は、例えば、このエンティティに関連する他のエンティティを保持するナビゲーションプロパティであります私たちのケースでは、学生エンティティは、彼に関連するすべてのエンティティエンティティのデータを保持します。

ヒント:1を持つテーブル:M関係&それがMのテーブルのナビゲーション・プロパティを含むべきであるため、1つの側のモデル表現であり、それは収集

なければならない。 学生

3と同じ

  • コーステーブル を。加入契約テーブル

    public partial class Enrollment 
    { 
        public int EnrollmentID { get; set; } 
        public Nullable<decimal> Grade { get; set; } 
        public int CourseID { get; set; } 
        public int StudentID { get; set; } 
    
        public virtual Course Course { get; set; } 
        public virtual Student Student { get; set; } 
    

    }

  • SudentIDプロパティは、外部キーであり、対応するナビゲーションプロパティが学生です。登録エンティティは1つの学生エンティティに関連付けられているため、このプロパティは1つの学生エンティティのみを保持できるため、IEnumerableを使用していません。 courseIDプロパティと同じです。

    ヒント:M側のテーブルは、外部キー&対応するナビゲーションプロパティではなく、コレクションを含める必要があります。

    +0

    ありがとうございました! – user3627847

    +0

    正解を選択することを忘れないでください – SaadK