簡體   English   中英

實體框架建模代碼優先

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM