【问题标题】:How to integrate console app with the existing asp.net mvc 3 app in one solution?如何将控制台应用程序与现有的 asp.net mvc 3 应用程序集成到一个解决方案中?
【发布时间】:2013-01-28 14:09:07
【问题描述】:

我有一个 mvc 3 项目,我需要使用 xml 文件中的数据填充 sql 数据库。所以我将控制台应用程序项目添加到解决方案中,并编写了将在屏幕上显示所有需要的数据的代码。现在我想将数据写入数据库。这是代码块:(来自控制台应用程序)

    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);
        }
    }

首先,当我运行控制台应用程序时,NullReferenceException 发生在 MvcProjectName.Designer.cs 文件的以下行中:

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

NullReferenceException:对对象的引用未指向对象实例。

所以,我有很多问题:

1) 如何将控制台应用代码与 mvc 3 应用代码集成到一个解决方案中?

2) 我还在 stackoverflow 上找到了this post。 但是我不能在 ConsoleProject 的引用中添加对 MvcProject 的引用吗?并且通过这种方式访问​​“mvc repositories”代码?

3) 我应该在控制台应用程序中使用 ninject 容器吗?

4) 将数据从 xml 文件加载到 slq 数据库中是否有更好的实现?我以前从来没有在一个解决方案中有两个项目,所以mabby还有其他方法可以很好地处理这种情况吗?

提前感谢您的帮助!

编辑:

我添加了带有连接字符串的 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 目录中也出现了扩展名为“Program Debug Database”的“WebStore”文件。

【问题讨论】:

  • 我更新了答案,希望能解决您的连接字符串错误。

标签: asp.net asp.net-mvc asp.net-mvc-3 architecture


【解决方案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/

【讨论】:

  • 我使用模式存储库)当然在依赖解析器中注册依赖。此外,我在控制台应用程序中根本没有 app.config。这应该是问题
  • 嗨,Aleksei,我看到您正在使用存储库模式。但是,您的存储库是否在您的 MVC 应用程序中定义?如果是这样,我建议您将它们移出,以便您可以在其他程序集中引用您的 DAL。
  • 谢谢!现在我明白为什么应该在其他项目中定义 DAL 了!我认为对于我不太大的应用程序来说,这种架构就足够了。
【解决方案2】:

我猜您需要在控制台应用程序使用的App.config 文件中定义一个连接字符串(与您在 web.config 中使用它的方式相同):

<connectionStrings>
    <add 
        name="WebStoreConnectionString" 
        connectionString="YOUR CONNECTION STRING COMES HERE" 
        providerName="System.Data.SqlClient"
    />
</connectionStrings>

【讨论】:

  • 谢谢!我将带有连接字符串的 app.config 添加到我的数据库中。得到另一个例外。我应该以某种方式更改此路径:AttachDbFilename=|DataDirectory|\WebStore.mdf。隐式指定它的方法是什么?
  • Aleksei,关于这个话题,看看这个msdn.microsoft.com/en-us/library/…。此外,这个主题也可能会有所帮助:stackoverflow.com/a/3501950/1220302
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多