0

次の方法で Entity Framework - Code First を使用すると、エラーが発生します。

Global.asax.cs ファイルの内部 (開発時)

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

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'

4

1 に答える 1

0

あなたができると思われる最善の方法は、いくつかのコードを実行して、テーブルが存在するかどうかを確認することです。ただし、ここには多くのオーバーヘッドがあります。本当に、これを例外処理でキャッチして、その時点で処理することをお勧めします。どのくらいの頻度でテーブルがありませんか。

このチェックが本当に必要な場合は、アプリの開始時にチェックし、その時点以降に存在することを信頼する必要があります。

于 2012-04-18T02:15:27.937 に答える