2017-03-24 2 views
0

私のプログラムの中断がどのような問題であるかに関する提案が必要です。ASP.Net別のテーブルがあっても1つのテーブルに対するデータベースクエリの例外

NullReferenceException: Object reference not set to an instance of an object.

同じコントローラからのクエリで、同じDbContext接続から実行されるクエリはありません。

一般的なASP.Net Core WebAPIテンプレートを使用して最初から再起動することに決めました。私は以下の2つのクラスを挿入し、ビルドを実行し、問題なくコントローラーとビューに足場を足取りしました。私はさらに、Visual Studio 2015 CommunityのSQL Server Object Explorerから、両方のテーブルにある「View Data」の機能を持っています。 OrderクラスのForeign Key参照をCompanyクラスに取り出しました。これは、DB上の管理者権限とdboを持つ私のマシン上のテスト環境内にあります。

public class Order{ } 
public class Company { } 

public class DataMineDbContext : DbContext 
{ 
    public DataMineDbContext(DbContextOptions<DataMineDbContext> options) : base(options) { } 
    public virtual DbSet<Company> Company { get; set; } 
    public virtual DbSet<Order> Order { get; set; } 
} 

public class CompaniesController : Controller 
{ 
    private readonly DataMineDbContext _context; 

    public CompaniesController(DataMineDbContext context) 
    { 
     _context = context;  
    } 

    // GET: Companies 
    public async Task<IActionResult> Index() 
    { 
     return View(await _context.Company.ToListAsync()); //this works 
    } 
} 

public class OrdersController : Controller 
{ 
    private readonly DataMineDbContext _context; 

    public OrdersController(DataMineDbContext context) 
    { 
     _context = context;  
    } 

    // GET: Orders 
    public async Task<IActionResult> Index() 
    { 
     return View(await _context.Order.ToListAsync()); //this throws error 
     //An unhandled exception of NullReferenceException 
    } 
} 

UPDATE:私の注文コントローラ用のビューを作成するために、私はURLを入力することができますし、それがリダイレクトに「インデックス」

public async Task<IActionResult> Create(int id, [Bind("Color,CompanyId,Delivered,Filled,ItemName,OrderNumb,Ordered,Price,Qty,Size")] Order order) 
    { 
     order.CompanyId = id; 
     if (ModelState.IsValid) 
     { 
      _context.Add(order); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 
     return View(order); 
    } 
} 

にDB、まだエラーに新しいレコードを挿入します注:私は同じサーバー内の別のDBに自分のアカウントのログインを設定しています。また、AspNetUsersテーブルにユーザー(挿入)を登録することもできますが、ログオフしてログインしようとすると、常に失敗します。これが起こったのはいつか、これらの問題が同じ問題の一部である可能性があります。しかし、1つのテーブルだけがルックアップを許可する理由は不明ですが、すべてが更新を許可します。また、私の経験を超えて、これはVisual Studioの問題かSQL Serverの問題かどうか。

更新:マックスさんのコメントの後、私は私のuserloginのデータベースと私のappDatabaseの両方のために

"Data Source={ServerName}\{InstanceName}; Initial Catalog={DatabaseName}; Integrated Security=True; Connect Timeout=15; MultipleActiveResultSets=true;"

に私たconnectionStringを変えました。これにより私はユーザーのためにログインすることができました。しかし、私はOrderテーブルに問い合わせることはできませんでした。したがって、私は新しいクラス、州(米国のすべての州の名前/コードとして)を試してみましたが、私はコントローラとビューを足場に取りました。このクエリは、CompanyとStateの両方で動作しますが、Orderでは動作しません。だから私はDBSetsのためのDataMineDbContextの仮想キーワードと関係があると思いました。州がそれを足場にしていないので、私の問題は解決しませんでした。私はそれが命名規則のものだったが、アプリケーションと私のデータベースの両方で購入する順序を変更しました。これは助けにはなりません。

+0

を再投稿し、あなたは、ご注文は、データベース内の値を持っていることを確認していますか? – Usman

+0

@Usmanはい2つのレコードです。 「SQL Serverオブジェクトエクスプローラから、両方のテーブルにある「データの表示」にも対応できます。また、これは索引と編集での検索での問題に過ぎません。作成URLを入力すると、ビューに移動して新しいレコードを保存します。私はOrder Controllerにアクションを作成するようにコードを更新しました – Edward

+1

接続文字列に 'MultipleActiveResultSets = true;'が存在するかどうかを確認してください。 – Max

答えて

1

私はブラウンストーン氏からDatabase Adminstratorsについて学んだことがあります。それは、自分のデータベーステーブル設定と一致するようにヌル入力可能なタイプにプロパティが正しく設定されていないOrder Modelクラスになったことです。この例では、DATETIME? null可能です。

私はリンクNRE crash when property isn't marked as nullable.Null reference when using Take

関連する問題