0

mvc 3プロジェクトがあり、SQLデータベースにxmlファイルのデータを入力する必要があります。そこで、コンソールアプリプロジェクトをソリューションに追加し、必要なすべてのデータを画面に表示するコードを記述しました。次に、データベースにデータを書き込みます。コードのチャンクは次のとおりです:(コンソールアプリから)

    public static void Main()
    {
        IKernel ninjectKernel = new StandardKernel();
        ninjectKernel.Bind<IItemsRepository>().To<ItemsRepository>();
        ninjectKernel.Bind<IProductRepository>().To<ProductRepository>();
        ninjectKernel.Bind<IShippingRepository>().To<ShippingRepository>();

        var itemsRepository = ninjectKernel.Get<IItemsRepository>(); // redirection to datacontext file
        var productRepository = ninjectKernel.Get<IProductRepository>();
        var shippingRepository = ninjectKernel.Get<IShippingRepository>();

        var doc = XDocument.Load(@"C:\div_kid.xml");
        var offers = doc.Descendants("offer");

        foreach (var offer in offers)
        {   // here I use Linq to XML to get all needed data from xml file: 
            // name, description, price, category, shippingCost, shippingDetails

            Product product = productRepository.CreateProduct(name, description, price, category, "Not Specified", "Not Specified");
            Shipping shipping = shippingRepository.CreateShipping(shippingCost, shippingDetails);

            // here I think I will just create "admin" user and assign its "UserId" to "userId"
            Guid? userId = null;
            Item item = itemsRepository.CreateItem(product.ProductId, shipping.ShippingId, (Guid) userId, DateTime.Now);

            // Resharper highlights this line like unreachable. Why?
            Console.WriteLine("name: {0}", offer.Element("name").Value);
        }
    }

まず、コンソールアプリを実行すると、次の行のMvcProjectName.Designer.csファイルでNullReferenceExceptionが発生します。

public WebStoreDataContext() : 
    base(global::System.Configuration.ConfigurationManager.ConnectionStrings["WebStoreConnectionString"].ConnectionString, mappingSource)                    

NullReferenceException:オブジェクトへの参照がオブジェクトインスタンスを指していません。

だから、私はたくさんの質問があります:

1)コンソールアプリコードをmvc 3アプリコードと1つのソリューションで統合するにはどうすればよいですか?

2) stackoverflowに関するこの投稿も見つけました。しかし、ConsoleProjectの参照にMvcProjectへの参照を追加することはできませんか?そして、この方法で「mvcリポジトリ」コードにアクセスできますか?

3)コンソールアプリでninjectコンテナを使用する必要がありますか?

4)xmlファイルからslqデータベースにデータをロードするより良い実装はありますか?私はこれまで1つのソリューションで2つのプロジェクトを行ったことがないので、この状況を美しく処理する方法は他にもありますか?

よろしくお願いします!

編集:

接続文字列を含むapp.configファイルを追加しました:

<add
    name="WebStoreConnectionString" connectionString="Data Source=(LocalDB)\v11.0;
     AttachDbFilename=|DataDirectory|\WebStore.mdf;Integrated Security=True;Connect Timeout=30"
  providerName="System.Data.SqlClient"
/>

コンソールアプリを実行すると、Linq to SQLの「.submitChanges()」メソッドが呼び出されたときに次のSqlExceptionが発生します。

ファイルC:\ Users \ Aleksey \ repos \ working_copy \ WebStore \ LoadDataTool \ bin \ Debug\WebStore.mdfの自動名前付きデータベースをアタッチしようとして失敗しました。同じ名前のデータベースが存在するか、指定されたファイルを開くことができないか、UNC共有にあります。

また、ディレクトリLoadDataTool \ bin \ Debugに、拡張子が「ProgramDebugDatabase」の「WebStore」ファイルが表示されました。

4

2 に答える 2

1

コンソールアプリケーションで使用されるファイルに接続文字列を定義する必要があると思いApp.configます(web.configにあるのと同じ方法で)。

<connectionStrings>
    <add 
        name="WebStoreConnectionString" 
        connectionString="YOUR CONNECTION STRING COMES HERE" 
        providerName="System.Data.SqlClient"
    />
</connectionStrings>
于 2013-01-28T14:46:58.970 に答える
1

ソリューションアーキテクチャを正確に推測するのは難しいですが、私が読んでいることから、データアクセス層(DAL)をプレゼンテーション層(MVC)から分離したようには思えません-これが理由のようですコンソールアプリケーションでそれを参照しようとしています。

その仮定で、これが私があなたの質問に答える方法です。

  1. 私はそうしませんでした...しかし、私が行く場合は、1)必要なすべての参照があることを確認し、2)app.configファイルが正しいデータベースとサーバーを指しているように正しく設定されていることを確認します。
  2. 別のプロジェクトでリポジトリを分離し、依存関係リゾルバーを使用してそれらをMVCアプリケーションに挿入します。これにより、コンソールアプリケーションはDALアセンブリを参照するだけで済みます。したがって、コンソールアプリのすべての参照は必要ありません。
  3. 将来的にDALを引き出すつもりなら、そうです。(**#2の提案を参照)。
  4. XMLファイルとデータベースを作成せずにソリューションを実行できない場合を除いて、より良いソリューションは、XMLファイルをアップロードしてタスクを完了することができる管理コントローラーとアクションを作成することです。

それがお役に立てば幸いです。

アップデート

あなたの問題のために

ファイルの自動名前付きデータベースをアタッチする試み

接続文字列を次のように変更します。

Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\WebStore.mdf;

接続文字列の適切なソースは次のとおりです。http: //www.connectionstrings.com/

于 2013-01-28T15:04:34.793 に答える