1

У меня есть то, что я думаю, это простая проблема моделирования, но по какой-то причине я не могу окунуться в голову, что лучший способ ее решить.Entity Framework Код для моделирования сначала

У меня есть класс 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; } 
} 

мне было интересно, если это было бы правильно смоделировать это, я чувствую, как будто их это лучше потому что прямо сейчас, если я хочу получить информацию о телефоне оператора Person, мне нужно сначала получить идентификатор phonecarrier Person, а затем я должен позвонить PhoneCarrier, где id id = phonecarrier. Вот конкретный пример

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

Есть ли способ, где я мог бы установить его (например, сделать поле PhoneCarrier Int в классе 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); 
1

Использование навигационных свойств. См. Пример здесь: Code First Conventions. Посмотрите, как Департамент связан с курсом в примерах.

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

Вы только что удалили свой ответ и сделали новый с той же деталью, вы знаете, что люди с 10 тыс. Репутации или более могут видеть удаленные сообщения? – DavidG

+0

Я не понимаю, в чем проблема, я сделал ответ более ясным, разве вы не можете оставить его в покое? – Bryan

+0

Если вы удалите ответ и сделаете еще один с той же информацией, это плохое поведение. Я просто пытаюсь помочь вам здесь. – DavidG

Смежные вопросы