繁体   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