[英]Entity Framework Modeling code first
我認為這是一個簡單的建模問題,但是由於某些原因,我無法解決最好的解決方法。
我有一個Person類(包含有關用戶的信息),還有一個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,其中id = phonecarrier id。 這是一個實際的例子
var phoneCarrierId = person.PhoneCarrier;
return db.PhoneCarriers.Where(x => x.ID == phoneCarrierId).FirstOrDefault().EmailExtension;
有沒有一種方法可以將其設置(例如,將PhoneCarrier類型的Person類中的int PhoneCarrier字段設置為),我可以僅將其調用為db.Person.PhoneCarrier.EmailExtension? 這似乎是一種更清潔的方法,我想知道這是否可行,或者我做的方式是否是更正確的方法...
您只需要為該人分配一個電話運營商,而不是整個列表。 另外,重命名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);
使用導航屬性。 請參閱此處的示例: Code First Conventions 。 在示例中查看部門與課程的關系。
下面的代碼將解決該問題。 我建議將類中的id屬性更改為TableNameId,例如PersonId和PhoneCarrierId。
請參閱此處以獲取更多信息-https: //msdn.microsoft.com/zh-cn/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;}
//...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.