public class Article
{
[Key]
public int ID { get; set; }
public string Title{get;set;}
public int AuthorssID { get; set; }
public Author Author { get; set; }
}
public class Author
{
[Key]
public int ID{get;set;}
[MaxLength(50),Required]
public string Name { get; set; }
public string Address { get; set; }
}
CodeFirst生成的数据表:
约定是以类名加ID来为外键命名的,如果找不到类名加ID的属性,则会成一个这样的规则来做为外键名。
同时也可以强制加ForeignKey来标识外键
public class NewArticle//ForeignKey 用来指示外键名为AuthorssID
{
[Key]
public int ID { get; set; }
public string Title { get; set; }
public int AuthorssID { get; set; }
[ForeignKey("AuthorssID")]
public Author Author { get; set; }
}
生成的表为:
===============================================================================
public class Department
{
[Key]
public int ID{get;set;}
[MaxLength(50)]
public string Name { get; set; }
//public virtual List<Employee> EmployeeList { get; set; }
public List<Employee> EmployeeList { get; set; }
}
public class Employee
{
[Key]
public int ID { get; set; }
[MaxLength(30)]
public string Name { get; set; }
}
生成的数据表:可看到自动为Employee 添 加了一个Department_ID的外键
添加一个virtual
public class Department1
{
[Key]
public int ID{get;set;}
[MaxLength(50)]
public string Name { get; set; }
public virtual List<Employee1> EmployeeList { get; set; }
}
public class Employee1
{
[Key]
public int ID { get; set; }
[MaxLength(30)]
public string Name { get; set; }
}
生成的数据表:
==================================
public class Department3
{
[Key]
public int ID{get;set;}
[MaxLength(50)]
public string Name { get; set; }
public virtual List<Employee3> EmployeeList { get; set; }
}
public class Employee3
{
[Key]
public int ID { get; set; }
[MaxLength(30)]
public string Name { get; set; }
public int DepartmentID{get;set;}
[ForeignKey("DepartmentID")]
public virtual Department3 Department { get; set; }
}
综上看来,导航属性(Virtual)与生成表结构没有关系,只是用来标识在LazyLoading时才会有用得到。
接下来,接着试验。
/// <summary> /// 会员 /// </summary> public class User { /// <summary> /// 用户ID /// </summary> [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public Int64 UserId { get; set; } /// <summary> /// 用户名 /// </summary> [Required] [StringLength(50)] public string NickName { get; set; } /// <summary> /// 渠道负责人ID /// </summary> public int ChannelId { get; set; } /// <summary> /// 达人用户级别 /// </summary> public int UserRank { get; set; } /// <summary> /// 渠道负责人 /// </summary> public virtual Channel Channel { get; set; } [NotMapped] public Guid Id { get; set; } }
/// <summary> /// 渠道 /// </summary> public class Channel { [Key] public int ChannelId { get; set; } /// <summary> /// 渠道名 /// </summary> [StringLength(100)] [Required] public string ChannelName { get; set; } /// <summary> /// 是否可用 /// </summary> public int IsActive { get; set; } [NotMapped] public Guid Id { get; set; } }
运行测试
var vUser = db.User.FirstOrDefault(p => p.UserId > 0); Console.WriteLine(vUser.NickName); Console.WriteLine(vUser.Channel.ChannelName);///如果Channel不为Virtual则在此处会报错,除非用Include显示加载