首先是实体框架建模代码

本文关键字:建模 代码 框架 实体 | 更新日期: 2023-09-27 18:07:55

我有一个我认为是一个简单的建模问题,但由于某种原因,我不知道解决它的最佳方法是什么。

我有一个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; }

这是phoneccarrier类

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

我想知道这是否是建模这个的正确方式,我觉得这是一个更好的解决方案,因为现在,如果我想获得关于Person的电话运营商的信息,我必须首先获得Person的电话运营商id,然后我必须调用phonecarrier,其中id =电话运营商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);

使用导航属性。请看这里的例子:代码优先约定。请在示例中查看本系与课程的关系。

下面的代码将解决这个问题。我建议在你的类更改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;}
    //...
}