5

Entity Framework、Code First データ モデルを使用した MVC4/Web API プロジェクトがあります。データ コンテキストとモデルを使用して読み取り/書き込みメソッドを持つ新しい API コントローラーを作成しようとすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というアラートが表示されます。

少し調べてみたところ、.csproj ファイルのプロジェクト タイプ Guid が正しくない、MvcScaffolding nuget パッケージのインストールが不完全である、Powershell 3 をインストールするという 1 つの提案が原因であることがわかりました。

すべてのプロジェクト タイプ GUID が正しいことを確認し、MvcScaffolding パッケージが正しくインストールされていることを確認し、Powershell 3 もインストールしました。

これで問題が解決したものはありません。私が考えることができるのは、テーブル/関係を正常に作成したものの、データ コンテキスト/モデルに問題があるということだけです。以下のコード:

環境:

public class PropertySearchContext : DbContext 
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Property>().HasRequired(p => p.Office).WithMany(o => o.Properties).HasForeignKey(p => p.OfficeId);
    }

    public DbSet<Office> Offices { get; set; }
    public DbSet<Property> Properties { get; set; } 
}

モデル:

[Serializable]
public class Property
{
    public int PropertyId { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Town { get; set; }
    public string County { get; set; }
    public string Postcode { get; set; }

    public int Bedrooms { get; set; }
    public int Bathrooms { get; set; }

    public string UmbracoNodeId { get; set; }
    public string MainImageUrl { get; set; }
    public string ListingImageUrl { get; set; }
    public int TotalImageCount { get; set; }
    public PropertyType PropertyType { get; set; }
    public PropertyStatus PropertyStatus { get; set; }
    public long Price { get; set; }
    public string ListingUrl { get; set; }

    //Navigation Properties
    public int OfficeId { get; set; }
    public virtual Office Office { get; set; }

    //Meta properties
    public DateTime CreatedAt { get; set; }
    public string CreatedBy { get; set; }
    public DateTime UpdatedAt { get; set; }
    public string UpdatedBy { get; set; }
}

接続文字列:

<add name="PropertySearchContext" connectionString="Data Source=MERCURY\SQLEXPRESS;Initial Catalog=DATABASE_NAME;Integrated Security=False;User ID=dbFakeUser;Password=fakePassword;Connect Timeout=10" providerName="System.Data.SqlClient" />

私はすべての提案を試しましたが、まだスキャフォールディングを使用してコントローラーを作成できないため、これに関する助けをいただければ幸いです。私を怒らせる!

ありがとう!

4

5 に答える 5

3

私の問題は同じで、解決策が異なっていたので、回答を追加しています。参照されたアセンブリとは関係がありませんでした。まず、Web API プロジェクトが (ゼロから) 作成されたばかりだったために発生したと思います。

OP コードに基づいたコード例をいくつか示します。まず、から継承するコンテキスト クラスはDbContext、接続文字列名を引数として渡す基本コンストラクターを呼び出す必要がありました。

public class PropertySearchContext : DbContext 
{
    public PropertySearchContext () : base("name=PropertySearchContext")

次に、Web API アプリケーションは内部で Web.config 内を調べて、 という名前の接続文字列を探しますPropertySearchContext。Web.config には既に が付属しているDefaultConnectionため、適切な名前と設定で新しいものを追加する必要がありました。

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\DATABASE_NAME.mdf;Initial Catalog=DATABASE_NAME;Integrated Security=True" providerName="System.Data.SqlClient" />
    <add name="PropertySearchContext" connectionString="Data Source=MERCURY\SQLEXPRESS;Initial Catalog=DATABASE_NAME;Integrated Security=False;User ID=dbFakeUser;Password=fakePassword;Connect Timeout=10" providerName="System.Data.SqlClient" />
  </connectionStrings>

注: OQ には既にその接続文字列があります。

最後に、WebAPI プロジェクトをビルドする必要がありました。成功すると、コントローラーの作成は正常に機能しました。

于 2016-02-18T03:44:34.163 に答える