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