在实体框架中共享客户端和服务器之间的数据库访问方法(C#.Net)

时间:2012-04-04 15:55:41

标签: c# .net entity-framework architecture client-server

这是一种客户端 - 服务器架构问题。

我的解决方案中有两个项目:一个项目用于客户端使用Entity Framework和SQL Server Compact数据库,另一个项目用于服务器端,也使用Entity Framework但使用真正的SQL Server数据库。两个数据库具有完全相同的数据库模式,因此尽管它们使用不同的.edmx文件,但生成的实体看起来相同且仅在名称空间中不同。顺便说一句,我正在使用ADO.NET DbContext Generator来生成持久性无知的实体类。到现在为止还挺好。现在我写了一个(非常大的)类,其中包含所有服务器数据库访问方法,例如:

    public User CreateUser(string userId, string username, bool isGlobalAdmin)
    {
        using (var context = new ServerEntities())
        {
            try
            {
                var user = new User
                {
                    UserID = userId,
                    Username = username,
                    IsGlobalAdmin = isGlobalAdmin
                };

                context.User.Add(user);
                context.SaveChanges();

                return user;
            }
            catch (Exception ex)
            {
                HandleEfException(ex);
            }
        }

        return null;
    }

问题是我需要在客户端使用相同方法的同一个类。因此,我将此类复制到客户端项目,将ServerEntities重命名为ClientEntities并更改名称空间以使用客户端实体。这非常难看,因为如果发生变化,我需要维护这两个类。有没有办法抽象整个事物并在两端(客户端和服务器)使用相同的类(位于另外两个项目引用的单独的项目中)?

我真的很感谢你的帮助。

最佳,

安东尼

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

#if SERVER
    using (var context = new ServerEntities())
#elif CLIENT
    using (var context = new ClientEntities())
#endif

然后,在两个项目的项目属性中,在Build下,然后在Conditional Compliation Symbols框中,您可以为每个项目添加令牌。因此,在服务器项目中,添加SERVER并在客户端中添加CLIENT。如果那里已有令牌,请用分号(;)分隔。

无论您将该课程放入哪个项目,请将其添加为第二个项目的链接。例如,如果类文件位于服务器项目中,则在客户端项目中,转到Add - >现有项目。选择文件,然后单击Open旁边的箭头,然后单击“添加为链接”。这将确保只有一个副本链接到两个项目。

编译每个代码时,编译器将查看标记,评估它们,它将使用Client项目中的ClientEntities行和Server项目中的ServerEntities

如果需要,您可以为名称空间执行相同的预处理程序指令。这是解释指令的an MSDN article

答案 1 :(得分:0)

如果保证数据库完全相同,为什么还需要两组实体?只需使用一套就可以实现互操作。