2012-04-18 157 views
0

错误在使用实体框架 - Code First时出现以下错误。EF代码优先 - 插入或更新;如果表不存在

里面的Global.asax.cs文件(在开发阶段)

void Application_Start(object sender, EventArgs e) 
{ 
    // Code that runs on application startup 
    Database.SetInitializer<Investments>(new DropCreateDatabaseIfModelChanges<Investments>()); 
} 

投资类的比较简单:

public class Investments : DbContext 
{ 
    public Investments() : base("Investments") { } 
    public DbSet<Holding> Holdings { get; set; } 
} 

,如果他们存在于表中我可以更新记录(仅当表存在时),以及如果它们不存在(即使表不存在)使用以下代码插入记录:

Decimal totalPercentage; 
List<Holding> mergedHoldings = GetMergedHoldings(fund, out totalPercentage); 

try 
{ 
    Investments inv = new Investments(); 
    foreach (Holding h in mergedHoldings) 
    { 
     if (inv.Holdings != null && inv.Holdings.Count<Holding>() > 0) 
     { 
      var record = inv.Holdings.FirstOrDefault(m => m.Name == h.Name); 

      if (record != null) 
      { 
       record.Percentage = h.Percentage; 
       record.Symbol = h.Symbol; 
       record.Sector = h.Sector; 
       inv.Holdings.Attach(record); 
       inv.Entry(record).State = System.Data.EntityState.Modified; 
      } 
     } 
     else 
      inv.Holdings.Add(h); 
    } 
    inv.SaveChanges(); 
} 
catch (Exception e) 
{ 
    throw; 
} 

我的问题出现在表尚不存在时。我无法查看是否有任何记录匹配,因为,表格不在那里!有没有简单的解决方法呢?我知道我想保留if-exists-then-update-else-add代码,但是我必须在初始加载运行期间注释if-exists-then-update的检查。这在开发过程中很烦人。

的错误是: System.Data.SqlClient.SqlException:无效的对象名称dbo.Holdings“

回答

0

你似乎是能够做的最好的是Run some code to check if a table exists。但是,这里有很多开销。真的,我会建议让它在你的异常处理中被捕获并在那个时候处理它。你多久没有一张桌子?

如果你确实需要这个检查,那么你应该在应用程序启动时检查,然后相信它在那之后存在。