Entity Framework 先建模代码
Entity Framework Modeling code first
我认为这是一个简单的建模问题,但出于某种原因,我无法确定解决该问题的最佳方法。
我有一个人 class(包含有关用户的信息),我有一个 PhoneCarrier class,其中包含有关 PhoneCarriers 的信息(他们的姓名和电子邮件扩展名,用于将电子邮件发送到人 phone)。
这就是人class
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; }
这是电话运营商class
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; }
}
我想知道这是否是建模的正确方法,我觉得他们是更好的解决方案,因为现在,如果我想获得有关一个人的 phone 携带者的信息,我必须首先获得该人的 phone 运营商 ID,然后我必须调用 PhoneCarrier,其中 id = phone 运营商 ID。这是一个实际的例子
var phoneCarrierId = person.PhoneCarrier;
return db.PhoneCarriers.Where(x => x.ID == phoneCarrierId).FirstOrDefault().EmailExtension;
有没有一种方法可以将它设置为我可以直接调用 db.Person.PhoneCarrier.EmailExtension 的地方(例如将 Person class 类型的 PhoneCarrier 中的 int PhoneCarrier 字段设置为?这似乎是一种更简洁的方法,我想知道这是否可行,或者我这样做的方式是否更正确...
您只需将一个 phone 承运人分配给此人,而不是整个列表。另外,重命名 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。看看Department和Course在例子中的关系。
下面的代码将解决这个问题。我建议将 类 中的 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;}
//...
}
我认为这是一个简单的建模问题,但出于某种原因,我无法确定解决该问题的最佳方法。
我有一个人 class(包含有关用户的信息),我有一个 PhoneCarrier class,其中包含有关 PhoneCarriers 的信息(他们的姓名和电子邮件扩展名,用于将电子邮件发送到人 phone)。
这就是人class
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; }
这是电话运营商class
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; }
}
我想知道这是否是建模的正确方法,我觉得他们是更好的解决方案,因为现在,如果我想获得有关一个人的 phone 携带者的信息,我必须首先获得该人的 phone 运营商 ID,然后我必须调用 PhoneCarrier,其中 id = phone 运营商 ID。这是一个实际的例子
var phoneCarrierId = person.PhoneCarrier;
return db.PhoneCarriers.Where(x => x.ID == phoneCarrierId).FirstOrDefault().EmailExtension;
有没有一种方法可以将它设置为我可以直接调用 db.Person.PhoneCarrier.EmailExtension 的地方(例如将 Person class 类型的 PhoneCarrier 中的 int PhoneCarrier 字段设置为?这似乎是一种更简洁的方法,我想知道这是否可行,或者我这样做的方式是否更正确...
您只需将一个 phone 承运人分配给此人,而不是整个列表。另外,重命名 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。看看Department和Course在例子中的关系。
下面的代码将解决这个问题。我建议将 类 中的 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;}
//...
}