2017-04-21 69 views
0

我使用代码优先的方法来连接数据库和表,但由于一些问题启用/添加迁移命令不创建我的表,所以我手动创建表。应用程序构建成功意味着我假设objDbContext获取我的表。表格的名称是数据库中的任务。 下面是我的代码无效的对象名称'dbo.Tasks'。在代码优先的方法

eDbContext objDbContext = new eDbContext(); 
public List<TaskDetail> GetTasks(long eventId) 
     { 
      List<TaskDetail> listTask = new List<TaskDetail>(); 
      try { 

       listTask = (from task in objDbContext.Tasks 
          where task.EventId==eventId 
          select new TaskDetail 
          { 
           Id = task.Id, 
           Title = task.Title, 
           Description = task.Description, 
           StartDate = task.StartDate, 
           EndDate = task.EndDate 
          } 
          ).ToList(); 
      } 

      catch(Exception ex) { 
       throw ex; 
      } 
      return listTask; 

     } 

下面是数据库环境

public class eDbContext : DbContext 
    { 
     public DbSet<Task> Tasks { get; set; } 
    } 
+1

注意:'throw ex'重写堆栈跟踪; '扔'会做得很好。侧面说明:为什么“抓”只是为了“扔”? – TheLethalCoder

+0

基本上你做错了所有的事情...... – Valkyrie

+0

所以Valkyriee,我在那里犯了什么错误。请建议我,因为我是第一个编码的新手。 –

回答

1

如果您有其他实体类似的问题(多表名),那么你就应该删除PluralizingTableNameConvention(默认情况下EF产生多个表名来自实体类型名称)。此代码添加到您的DbContext类:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    base.OnModelCreating(modelBuilder); 
} 

如果其他表有多种名称,那么你应该只是修复映射Task实体@Valkyriee建议。

0

你的DbContext类应该是这样的:

public class eDbContext : DbContext 
{ 
    public IebContext() 
     : base("name=ConnectionStringName") 
    { 

     Database.SetInitializer(new MigrateDatabaseToLatestVersion<eDbContext, Migrations.Configuration>("CatalogName")); 

    } 
    public DbSet<Task> Tasks{ get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new TaskMap()); 
    } 

} 

为了您的迁移,你可以创建一个新的类,如:

internal sealed class Configuration : DbMigrationsConfiguration<eDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     //know this might loss data while its true. 
     AutomaticMigrationDataLossAllowed = true; 
     ContextKey = "Path to your DbContext Class"; 
    } 

    protected override void Seed(eDbContext context) 
    { 
     // This method will be called after migrating to the latest version. 

     // You can use the DbSet<T>.AddOrUpdate() helper extension method 
     // to avoid creating duplicate seed data. E.g. 
     // 
     // context.People.AddOrUpdate(
     //  p => p.FullName, 
     //  new Person { FullName = "Andrew Peters" }, 
     //  new Person { FullName = "Brice Lambson" }, 
     //  new Person { FullName = "Rowan Miller" } 
     // ); 
     // 
    } 
} 

现在使用这种方法,你可以创建EF代码 - 你的表首先,稍后再进行更改。请注意,我已经为Tasks添加了Map Class,这意味着我使用流利的API来映射我的实体:

public class TaskMap : EntityTypeConfiguration<Task> 
{ 
    public TaskMap() 
    { 
     ToTable("Tasks"); 
     HasKey(x => x.Id); 
    } 
}