2017-04-21 68 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); 
    } 
}