1

我有我認爲是一個簡單的建模問題,但由於某種原因,我無法圍繞解決問題的最佳方式解決問題。實體框架建模代碼優先

我有一個人類(它擁有關於用戶的信息),我有一個PhoneCarrier類,它擁有關於PhoneCarriers(他們的名字和電子郵件擴展將電子郵件發送到個人電話)的信息。

這是Person類

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

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

我想知道,這將是模型的正確方法,我感覺好像自己是一個更好的因爲現在,如果我想獲得關於某人的電話公司的信息,我必須先獲取該人員的電話號碼編號,然後我必須撥打其中id =電話號碼編號的PhoneCarrier。下面是一個實際的例子

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

有沒有一種方法,我可以將它設置(如使INT PhoneCarrier場在Person類類型PhoneCarrier的)的地方,我可以只叫db.Person.PhoneCarrier。 EmailExtension?這似乎是一個更清潔的方法,我想知道如果這是可能的,或者如果我這樣做的方式是更正確的方式...

+0

你爲什麼在人的IEnumerable PhoneCarriers。有一對多的關係嗎? – sachin

回答

1

您只需要有一個電話運營商分配給該人,不是整個列表。此外,重命名ID字段:

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; 

注:如果您使用的不是延遲加載,那麼你可能需要Include承運人:

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

下面的代碼將解決問題。我建議將類中的id屬性更改爲TableNameId,例如PersonId和PhoneCarrierId。

在這裏看到更多的信息 - 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