数据访问层 DatabaseContext 我是否必须为我的 类 映射所有关系?
Data Access Layer DatabaseContext Do I have to map all relationships for my classes?
在我的 OnModelCreating
方法中,我是否必须映射每个 table 的关系,就像我对 Tickets
和 Administrator
class 所做的那样?
我看了这篇文章,作者只做了其中一个关系,没有做全部。如果您向下滚动 link 我提供的“通过向数据库上下文添加代码来自定义数据模型”,您将明白我在说什么。
来源:Click Here
IssueContext.cs
public class IssueContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Ticket> Tickets { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<Administrator> Administrators { get; set; }
public DbSet<Depot> Depots { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Ticket>()
.HasMany(c => c.Administrators).WithMany(i => i.Tickets)
.Map(t => t.MapLeftKey("TicketID")
.MapRightKey("AdministratorID")
.ToTable("Adminstrators on Tickets"));
}
}
我的实体图
In my OnModelCreating method do I have to map every table's relationship like i did with my Tickets and Administrator class?
EF Code First 带有一些默认约定,例如您已经通过调用这行代码禁用的约定:
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
这些约定有助于 EF Code First 了解:
- 哪个实体属于哪个 table,
- 谁是主键,
- 您的实体之间的关系是什么,并将这些关系创建到您的数据库中 tables
- .....
如果您遵循约定,则无需使用流畅的 API 或数据注释属性编写配置。
您写的配置如下:
modelBuilder.Entity<Ticket>()
.HasMany(c => c.Administrators).WithMany(i => i.Tickets)
.Map(t => t.MapLeftKey("TicketID")
.MapRightKey("AdministratorID")
.ToTable("Adminstrators on Tickets"));
很有用,因为如果您让 EF 在 Ticket
和 Administrator
之间生成联接 table,您将很难知道哪个是左键,哪个是右键钥匙。您还告诉 EF 生成 TicketID
和 AdministratorID
作为列名,而不是 Ticket_ID
和 Administrator_ID
,这是它将在联接 table 上使用的默认名称。
回答你的问题。 不,您不需要为所有实体添加映射。尽可能使用约定,然后使用流畅的配置或数据注释属性来调整和细化一些列,table s 等等,就像你加入 table.
旁注: Adminstrators on Tickets
不是一个好的 table 名称 table 只需使用 AdministratorsTickets
在我的 OnModelCreating
方法中,我是否必须映射每个 table 的关系,就像我对 Tickets
和 Administrator
class 所做的那样?
我看了这篇文章,作者只做了其中一个关系,没有做全部。如果您向下滚动 link 我提供的“通过向数据库上下文添加代码来自定义数据模型”,您将明白我在说什么。
来源:Click Here
IssueContext.cs
public class IssueContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Ticket> Tickets { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<Administrator> Administrators { get; set; }
public DbSet<Depot> Depots { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Ticket>()
.HasMany(c => c.Administrators).WithMany(i => i.Tickets)
.Map(t => t.MapLeftKey("TicketID")
.MapRightKey("AdministratorID")
.ToTable("Adminstrators on Tickets"));
}
}
我的实体图
In my OnModelCreating method do I have to map every table's relationship like i did with my Tickets and Administrator class?
EF Code First 带有一些默认约定,例如您已经通过调用这行代码禁用的约定:
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
这些约定有助于 EF Code First 了解:
- 哪个实体属于哪个 table,
- 谁是主键,
- 您的实体之间的关系是什么,并将这些关系创建到您的数据库中 tables
- .....
如果您遵循约定,则无需使用流畅的 API 或数据注释属性编写配置。
您写的配置如下:
modelBuilder.Entity<Ticket>()
.HasMany(c => c.Administrators).WithMany(i => i.Tickets)
.Map(t => t.MapLeftKey("TicketID")
.MapRightKey("AdministratorID")
.ToTable("Adminstrators on Tickets"));
很有用,因为如果您让 EF 在 Ticket
和 Administrator
之间生成联接 table,您将很难知道哪个是左键,哪个是右键钥匙。您还告诉 EF 生成 TicketID
和 AdministratorID
作为列名,而不是 Ticket_ID
和 Administrator_ID
,这是它将在联接 table 上使用的默认名称。
回答你的问题。 不,您不需要为所有实体添加映射。尽可能使用约定,然后使用流畅的配置或数据注释属性来调整和细化一些列,table s 等等,就像你加入 table.
旁注: Adminstrators on Tickets
不是一个好的 table 名称 table 只需使用 AdministratorsTickets