English 中文(简体)
ASP.NET EntityFramework 4数据上下文问题
原标题:ASP.NET EntityFramework 4 data context issues

我在一个网站上工作,解决方案中有两个项目,一个是业务逻辑项目,另一个是网站项目。我知道我想将实体上下文排除在web项目之外,只使用框架创建的业务对象,但我不知道如何以这种方式保存修改后的对象。

假设我的实体模型创建了这个类:

public class Person //Person entity
{
    Int32 Id {get;set;}
    String Name {get;set;}
    Address Address {get;set;} //Address entity
}

我创建这个类是为了得到一个特定的人:

public static class PersonController
{
    public static Person GetById(int id)
    {
        using (Entities context = new Entities())
        {
            return context.Persons.FirstOrDefault(x => x.Id == id);
        }
    }
}

这允许我通过调用PersonController.GetById(1)来获取一个没有上下文的人;我可以在获得人员属性后更改这些属性,但我不知道如何将修改后的信息保存回数据库。理想情况下,我想分部类Person并添加一个.Save()方法,该方法将处理创建一个上下文,将Person添加到其中并保存更改。但当我不久前尝试此操作时,它仍然被附加到旧上下文中,存在各种问题,即使我取消对它的匹配并将其附加到新上下文中,它也会被附加为EntityState。如果我没记错的话,它是未更改的,所以当我在附加后调用context.SaveChages()时,实际上什么都不会更新。

我想我有两个问题:

1) 我做这件事的方法好吗/有更好的方法吗?如果我以一种非常糟糕的方式来做这件事,我会感谢一些psudo代码为我指明正确的方向;一个链接到解释如何进行这类事情的帖子也同样有效。

2) 有人能为保存方法提供一些psudo代码吗?save方法还需要处理是否附加或删除了地址。

最佳回答

有很多方法可以将实体框架作为持久层来处理。

首先,看起来你没有使用纯POCO。也就是说,您让EF为您的生成类(在EDMX.designer.cs文件中)。

这没什么错,但它确实抑制了关注点的干净分离(尤其是在单元测试方面)。

您是否考虑过实现Repository模式来封装EF逻辑?这将是将逻辑与UI隔离开来的好方法。

就储蓄而言,这是困难的地方。你是对的,大多数人使用分部类。通常,您会有一个基类,它公开了一个虚拟的“Save”方法,然后分部类可以覆盖该方法。

我个人不喜欢这种模式——我认为POCO不应该关心持久性或底层基础设施。因此,我喜欢使用纯POCO(无代码生成)、存储库模式和工作单元。

工作单元为您处理上下文打开/保存/关闭。

这就是(我的)工作单元的魔力。考虑一下您的“Web”项目中的一些代码:

var uOw = new UnitOfWork(); // this is class i created, implementing the UOW pattern
var person = repository.Find(10); // find s a "Person" entity (pure POCO), with id 10.
person.Name = "Scott";
uOw.Commit();

或添加新人员:

var uOw = new UnitOfWork();
var newPerson = new Person { Name = "Bob" };
repository.Add(newPerson);
uOw.Commit();

那有多好?:)

Line 1 creates a new sql context for you.
Line 2 uses that same context to retrieve a single "Person" object, which is a hand-coded POCO (not generated by EF).
Line 3 changes the name of the Person (pure POCO setter).
Line 4 Saves the changes to the data context, and closes the context.

现在,这些模式还有很多,所以我建议你仔细阅读这些模式,看看它是否适合你。

我的存储库也是用Generics实现的,所以我可以为所有业务实体持久性重用这个接口。

另外,看看我在Stack Overflow上提出的其他一些问题,您可以看到我是如何实现这些模式的。

不确定这是否是你想要的“答案”,但我想我会给你一些替代选择。

问题回答

暂无回答




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Transaction handling with TransactionScope

I am implementing Transaction using TransactionScope with the help this MSDN article http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx I just want to confirm that is ...

System.Web.Mvc.Controller Initialize

i have the following base controller... public class BaseController : Controller { protected override void Initialize(System.Web.Routing.RequestContext requestContext) { if (...

Microsoft.Contracts namespace

For what it is necessary Microsoft.Contracts namespace in asp.net? I mean, in what cases I could write using Microsoft.Contracts;?

Separator line in ASP.NET

I d like to add a simple separator line in an aspx web form. Does anyone know how? It sounds easy enough, but still I can t manage to find how to do it.. 10x!

热门标签