安排VS2008在程序集中生成LinqToSql / EntityFramework数据模型/上下文

时间:2010-04-20 14:34:45

标签: c# linq-to-sql entity-framework design-patterns repository-pattern

在VS2008生成的L2或EF DataModel的情况下,我应该使用什么模式进行数据访问?存储库模式还是什么?

我们知道VS2008会在同一个文件中生成Data-Models和DataContexts / ObjectContexts,那么,我应该如何在我的VS2008解决方案中安排我的VS2008程序集以实现分层设计?

如果我使用存储库模式,我应该如何在VS2008解决方案中安排我的程序集(因为数据模型和数据/对象上下文存储在同一个文件中......)?

任何网站/示例链接都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

在我的Entity Framework项目中,我保留了所有自动生成的代码,并扩展了一些自动生成的部分类以获得更具体的功能(我有时会将自动生成的类的对象转换为我的项目类)。

我认为模型和它的一些扩展应该在一个程序集中。您可以使用不同的类来以不同的方式保存数据 - 它们应该位于DataModel程序集将引用的不同程序集中。

也许我没有看到正确的问题。如果你愿意,可以尝试进一步解释你想要达到的目标。

答案 1 :(得分:1)

我所做的是在我自己的自定义类中包装(在我的情况下是Linq2Sql),它实现了存储库模式,这里是之前但有些相关的答案的粘贴摘录。

我建议您阅读The Onion Architecture并查看MVC StoreFront视频以获取灵感。神奇的部分是,将Linq2Sql部分或EF的东西推到一边,所以你不要像它一样坐在它上面,如果你需要它,请将其拉​​入,这样你可以使用Linq2Sql或EF或NHibernate。这是更多的工作,但为您提供更大的灵活性。

这是我的示例CarProject

在Car.Core项目中

 public interface ICarRepository
 {
    IQueryable<Car> GetAllCars();
    void Add(Car);
 }

然后我有一个接口的实现,它包含了对生成的Linq2Sql类的访问。

Car.Data项目

public class SqlCarRepository : ICarRepository
{
    private CarDataContext _context;

    public SqlCarRepository()
    {
        _context = new CarDataContext();
    }

    #region ICarRepository Members

    public IQueryable<Car> GetAllCars()
    {
        return _context.Cars;
    }

你可以拥有一个EF等效的课程,或NHibernate。

我还没有把所有这些完全排序,我还在学习,但我目前有这些项目:

Car.Core         --- All the interfaces and domain objects, DTO's etc
Car.Core.Tests   --- The tests of the core business logic.
Car.Web          --- Asp.net MVC frontend
Car.Web.Tests    --- Tests for the website
Car.Data         --- The Linq2Sql stuff lives in here
Car.Data.Tests   --- The tests for the DAL layer

在您的场景中,您可以将EF放入Car.Data,也可以将其更改为Car.Linq2Sql和Car.EntityFramework。不知道我会做什么。