1

は、簡単なモデリングの問題ですが、いくつかの理由のために私はそれを解決するための最良の方法は何であるかのまわりで私の頭をラップすることはできません。Entity Frameworkのモデルコード最初

私はPersonクラスを持っています(これはユーザーに関する情報を保持しています)、私はPhoneCarrierに関する情報を保持するPhoneCarrierクラスを持っています(名前と人の電話に電子メールを送信する電子メールの拡張子)。

これが良いが自分であるかのようにこれは

public class PhoneCarrier 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [Required(ErrorMessage ="{0} is required")] 
    public string Company { get; set; } 

    [Display(Name = "Email Extension")] 
    [Required(ErrorMessage ="{0} is required")] 
    public string EmailExtension { get; set; } 
} 

PhoneCarrierクラスで、これはこれをモデル化するための正しい方法だろう場合、私は思っていた、私が感じる

public class Person 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [Display(Name = "First Name")] 
    [Required(ErrorMessage ="{0} is required")] 
    public string FirstName { get; set; } 

    [Display(Name = "Last Name")] 
    [Required(ErrorMessage ="{0} is required")] 
    public string LastName { get; set; } 

    [Display(Name = "Dish Order")] 
    //[Range(1, byte.MaxValue, ErrorMessage = "Value of {0} must be greater than 0")] 
    public byte DishOrder { get; set; } 

    [Display(Name = "E-Mail")] 
    [RegularExpression(".+\\@.+\\..+", 
    ErrorMessage = "Please enter a valid email address")] 
    public string Email { get; set; } 

    [DataType(DataType.Text)] 
    [RegularExpression(@"(^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$)", ErrorMessage = "{0} must be a numeric value of length 10")] 
    [Display(Name = "Phone Number")] 
    //[DisplayFormat(DataFormatString = "{0:###-###-####")] 
    public string PhoneNumber { get; set; } 

    [Display(Name = "Phone Carrier")] 
    public int PhoneCarrier { get; set; } 

    public virtual ICollection<Fine> Fines { get; set; } 

    public virtual ICollection<DishDate> DishDates { get; set; } 

    [NotMapped] 
    public static IEnumerable<PhoneCarrier> PhoneCarriers { get; set; } 

Personクラスでありますソリューション私は人の電話のキャリアについての情報を取得したい場合は、今、私は最初の人のphonecarrier IDを取得する必要があり、その後、私はどこのid = phonecarrierのID phoneCarrierを呼び出す必要があるため。ここでは実際の例

var phoneCarrierId = person.PhoneCarrier; 
      return db.PhoneCarriers.Where(x => x.ID == phoneCarrierId).FirstOrDefault().EmailExtension; 

は私がちょうどdb.Person.PhoneCarrierを呼び出すことができますどこに(そのようなタイプのPhoneCarrierのPersonクラスにint型PhoneCarrierフィールドを作るように)を設定できます方法があります。 EmailExtension?これは、よりクリーンなアプローチのように思えるし、それが可能であった場合は、私はそれをやっている方法は、より正確な方法である場合、私は思っていた...

+0

-

は、詳細はこちらを参照してください。 1対多の関係はありますか? – sachin

答えて

1

あなたが唯一の人に割り当てられた単一の電話のキャリアを持っている必要があり、リスト全体ではありません。あなたは人を得るとき、あなたは、単にそれを行うことができます今すぐ

public class Person 
{ 
    //snip 

    public int PhoneCarrierId { get; set; } 
    public virtual PhoneCarrier PhoneCarrier { get; set; } 
} 

var person = db.Persons.Where(p => p.ID == 1); 
var carrier = person.PhoneCarrier; 

注:また、IDフィールドの名前を変更しますが、遅延ロードを使用していない場合、あなたはIncludeする必要があるかもしれませんキャリア:

var person = db.Persons.Include(p => p.PhoneCarrier).Where(p => p.ID == 1); 
1

ナビゲーションプロパティを使用します。以下の例を参照してください:Code First Conventionsこの例では、DepartmentがCourseにどのように関係しているかを見てみましょう。

0

以下のコードは、問題を解決します。クラスのidプロパティをTableNameId(PersonIdやPhoneCarrierIdなど)に変更することをお勧めします。あなたが個人的にIEnumerableを PhoneCarriersを持っていないのはなぜ https://msdn.microsoft.com/en-us/data/jj713564.aspx

public class Person 
{ 
    public int PersonId {get;set;} 
    //... 
    public int PhoneCarrierId { get; set; } 
    public virtual PhoneCarrier PhoneCarrier { get; set; } 
} 

public class PhoneCarrier 
{ 
    public int PhoneCarrierId {get;set;} 
    //... 
} 
+0

あなたは10kの担当者またはそれ以上を持つ人々はまだ削除された投稿を見ることができることを知って、ちょうどあなたの答えを削除し、同じディテールで新しいものを作っていますか?私は問題が何であるかを理解していない – DavidG

+0

、私は、明確な答えを作ったあなたは一人でそれを残すことはできませんか? – Bryan

+0

回答を削除して同じ情報を持つ別の回答を作成した場合、それは悪い動作です。私はここであなたを助けようとしています。 – DavidG

関連する問題