【问题标题】:Correct implementation of DAL with Entity Framework & Repository使用实体框架和存储库正确实现 DAL
【发布时间】:2015-04-09 20:48:47
【问题描述】:

我在使用单独的 DAL 项目设置 MVC/WebAPI 项目时遇到了一些困难和困惑。

我有一个名为“Dashboard.Data”的类库项目,我在其中为现有数据库生成了代码优先。这个类库现在包含我所有的模型类以及我的存储库。我还没有实现一个通用存储库,但到目前为止我应该仍然可以工作。

存储库:

namespace Dashboard.Data.Repository
{
    public class ProductRepository : IProductRepository, IDisposable
    {
        private DatabaseContext _context;
        public ProductRepository()
        {
            _context = new DatabaseContext();
        }
        public ProductRepository(DatabaseContext context)
        {
            this._context = context;
        }

        public async Task<IEnumerable<Department>> GetDepartmentList()
        {
            return await _context.Departments.ToListAsync();
        }
        protected void Dispose(bool disposing)
        {
            if (disposing)
                if (_context != null)
                {
                    _context.Dispose();
                    _context = null;
                }
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}

IRepository:

namespace Dashboard.Data.Repository
{
    public interface IProductRepository: IDisposable
    {
        Task<IEnumerable<Department>> GetDepartmentList();
    }
}

现在我有一个单独的 MVC/WebAPI 项目,我尝试在其中使用存储库。

我的 APIController:

namespace Dashboard.Controllers
{
    public class ProductsAPIController : ApiController
    {
        protected IProductRepository repository { get; set; }
        public ProductsAPIController()
        {
            this.repository = new ProductRepository();
        }

        [Route("api/Departments")]
        public async Task<IHttpActionResult> GetDepartmentList()
        {
            var departments = await repository.GetDepartmentList();
            return Ok(departments);
        }       
    }
}

但是,当我在 api 中调用 GetDepartmentList() 时,我注意到我的存储库的上下文不包含任何数据。它显示“枚举未产生结果”消息。

我担心自己在设置解决方案时弄糊涂了。

会不会是一个不正确的连接字符串?虽然它看起来确实能够看到数据库。我觉得我只是不正确地注入了上下文,但不确定在哪里或如何解决这个问题。

另外,我正在使用本地数据库文件 (.mdf)。这个文件应该放在哪里?我目前在 Dashboard.Data 文件夹中...应该在主项目的 App_Data 文件夹中吗?

编辑 1

我注意到 MVC 项目在 App_Data 文件夹中创建了一个新的空 .mdf 文件。我的 MVC 的 web.config 和 DAL 中的 app.config 都有这个连接字符串

我的连接字符串:

 <connectionStrings>
        <add name="NriDatabaseContext" connectionString="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\NRI_Database.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
      </connectionStrings>

是因为|DataDirectory|吗?

【问题讨论】:

  • 你能把你的连接字符串也贴出来吗?
  • 请参阅原始问题中的编辑。提前感谢您的帮助!
  • 您的 DatabaseContext 类是否必须命名为 NriDatabaseContext 才能自动使用此连接字符串?此外,我熟悉的实体框架连接字符串有一个连接字符串属性提供程序属性。这是我的一个例子(有一些删减):connectionString="metadata=res://*/ConanEntityModel.csdl|res://*/ConanEntityModel.ssdl|res://*/ConanEntityModel.msl;provider=System.Data.SqlClient;provider connection string=&amp;quot;data source=.\SQLEXPRESS;App=EntityFramework&amp;quot;" providerName="System.Data.EntityClient"
  • 不知道 mdf 位或 |DataDirectory|。我以前没有附加 mdf,我一直都安装了 SQL Express 的实例。

标签: c# asp.net-mvc entity-framework asp.net-web-api


【解决方案1】:

不确定这是否是正确的实现方式,但我继续在我的 MVC 项目中将 .mdf 移动到 App_Data,并重新创建了指向该文件的连接字符串。

迁移和数据访问现在似乎可以工作了。希望这是正确的解决方案。

【讨论】:

    【解决方案2】:

    连接字符串的DataDirectory 部分将自动替换您的Web 应用程序中的App_Data 目录。通过使用相对路径或更改代码中的位置,可以为数据库文件使用不同的位置。

    以下链接应提供更详细的信息:

    MSDN

    SQL Express Connection string - Relative to application location

    【讨论】:

      猜你喜欢
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2023-03-24
      • 2016-06-22
      相关资源
      最近更新 更多