数据访问层DatabaseContext我是否必须映射我的类的所有关系?

时间:2016-02-27 05:35:30

标签: c# asp.net-mvc relational-database entity-relationship

在我的OnModelCreating方法中,我是否必须映射每个表格的关系,就像我对TicketsAdministrator类所做的那样?

我读过这篇文章,作者只做了其中一个关系,但并不是全部关系。如果您向我提供的链接向下滚动" 通过向数据库上下文添加代码来自定义数据模型"你会看到我在说什么。

来源: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"));

            }
    }

我的实体图 enter image description here

1 个答案:

答案 0 :(得分:1)

  

在我的OnModelCreating方法中,我是否必须映射每个表的关系,就像我使用我的Tickets和Administrator类一样?

EF Code First附带了一些默认约定,例如您已通过调用此行代码禁用的约定:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

这些约定有助于EF Code First了解:

  • 哪个实体属于哪个表
  • 谁是主键,
  • 您的实体之间的关系是什么,并将这些关系创建到数据库表中
  • ....

如果遵循约定,则无需使用流畅的API或数据注释属性编写配置。

以下配置:

modelBuilder.Entity<Ticket>()
            .HasMany(c => c.Administrators).WithMany(i => i.Tickets)
            .Map(t => t.MapLeftKey("TicketID")
            .MapRightKey("AdministratorID")
            .ToTable("Adminstrators on Tickets"));

非常有用,因为如果让EF在TicketAdministrator之间生成连接表,您将会遇到一些问题,以确定哪个是左键,哪个是右键。您还告诉EF生成TicketIDAdministratorID作为列名,而不是Ticket_IDAdministrator_ID,它们将在连接表中使用默认名称。

回答你的问题。 不,您不需要为所有实体添加映射。尽可能使用约定,然后使用流畅的配置或数据注释属性来调整和优化某些列,表等,就像您一样你的联接表。

旁注: Adminstrators on Tickets不是表的好名称,只需使用AdministratorsTickets