0

我刚开始使用 Entity Framework,它创建了一个 Context 类,我可以使用它从中获取我需要的所有数据。但是我面临一个关于如何组织我的代码的问题,通过观看演示,这个人只是使​​用框架并在控制台应用程序上编写所有内容。什么是使用实体框架的最佳方式并且它看起来很干净?,我的意思是......现在使用 aspx 页面,我可以只使用 aspx.cs 来获取数据或保存数据。但我不希望这样,我希望它更有条理,尽管实体框架通过创建对象等几乎完成了所有工作。但是,我仍然需要使用类似的东西

using(var myobject = new MyContextData())
{
    blah blah..
}

你会说编写包装这些调用的类会更好吗?我真的很感激任何输入,因为它真的会让我成为使用实体框架的更好的程序员。

问候

4

3 回答 3

1

每个提供有关 EF 教程的人都应该问这个问题。很难说最好的方法是什么,但是将所有代码放在代码隐藏类 (aspx.cs) 中对可扩展性和可测试性没有帮助。请尝试阅读这篇文章:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net- mvc-应用程序

它不仅是asp.net 上的官方教程,而且主要表明,Framework EF 可以在当前幻想中正确使用Repository pattern

于 2012-11-25T07:32:34.073 回答
0

您在创建类来处理您的 EF 方面处于正确的轨道上。

这样做的最大好处是能够轻松地进行单元测试。

尽早测试并经常测试总是一个好主意。

我建议将您的 EF 相关类放在一个单独的项目中。

于 2012-11-25T07:31:57.893 回答
0

编辑:

我认为通用存储库是反模式。但我不明白@TomTom 的评论。

原答案:

正如 Radim Köhler 提到的,您需要实施Repository and Unit of Work patterns 但我认为他提供的文章并不完全正确。

在我目前的工作中,我使用以下这些模式的实现。例如,我们有三种类型的实体:Person, Good and Order. 我为 Persons 创建了存储库。在常见情况下,存储库不能是通用的。它必须包含代表该实体的特定查询的方法。因此,通过查看存储库的界面,您可以了解对实体(例如人)执行了哪些类型的查询。正如您将看到的,我为名为 的 Person 创建了 DTO PersonWrap。要从 Person 创建 PersonWrap 并从 PersonWrap 更新 Person,您可以使用 AutoMapper 而不是PersonWrap()构造函数和Update()方法。因为 EntityFrameworkDbContext实现了Unit of Work模式,您只需将创建的 DbContext 提供给存储库方法。如果存储库方法是一个单独的操作,并且您不需要此方法之外的 DbContext,您可以在此方法中创建和处置它。

public class Person {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string SecondName { get; set; }
    public DateTime RegistrationDate { get; set; }
    public List<Order> Orders { get; set; } 
}

public class Good {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class Order {
    public int Id { get; set; }
    public Person Person { get; set; }
    public Good Good { get; set; }
    public int Count { get; set; }
}

public class MyDbContext: DbContext
{
    public IDbSet<Person> Persons { get { return Set<Person>(); }}
    public IDbSet<Good> Goods { get { return Set<Good>(); }}
    public IDbSet<Order> Orders { get { return Set<Order>(); }} 
}

public class PersonRepository {
    public IEnumerable<Person> GetAll() {
        using (var context = new MyDbContext()) {
            return context.Persons.ToList();
        }
    }

    public IEnumerable<Person> GetLastWeekPersons() {
        using (var context = new MyDbContext()) {
            return context.Persons.Where(p => p.RegistrationDate > new DateTime().AddDays(-7)).ToList();
        }
    } 

    public Person GetById(int id, MyDbContext context) {
        return context.Persons.Include(p => p.Orders).FirstOrDefault(p => p.Id == id);
    }

    public Person GetById(int id) {
        using (var context = new MyDbContext()) {
            return GetById(id, context);
        }
    }
}

public class PersonWrap {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string SecondName { get; set; }
    public int OrderCount { get; set; }

    public PersonWrap(Person person) {
        Id = person.Id;
        FirstName = person.FirstName;
        SecondName = person.SecondName;
        OrderCount = person.Orders.Count;
    }

    public void Update(Person person) {
        person.FirstName = FirstName;
        person.SecondName = SecondName;
    }
}

public class PersonDetailsViewController {
    public PersonWrap Person { get; protected set; }

    public PersonDetailsViewController(int personId) {
        var person = new PersonRepository().GetById(personId);
        if (person != null) {
            Person = new PersonWrap(person);
        }
    }

    public void Save() {
        using (var context = new MyDbContext()) {
            var person = new PersonRepository().GetById(Person.Id, context);
            Person.Update(person);
            context.SaveChanges();
        }
    }
}
于 2012-11-25T11:14:17.220 回答