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

本文关键字:之间 服务器 共享 数据库 方法 访问 客户端 框架 实体 Net | 更新日期: 2023-09-27 18:30:04

这是一种客户端-服务器体系结构问题。

我的解决方案中有两个项目:一个用于客户端,使用实体框架和SQL Server Compact数据库,另一个用于服务器端,也使用实体框架,但使用真正的SQL Server数据库。两个数据库具有完全相同的数据库模式,因此尽管它们使用不同的.edmx文件,但生成的实体看起来相同,只是名称空间不同。顺便说一下,我正在使用ADO.NET DbContext生成器生成持久性未知实体类。到目前为止还不错。现在我写了一个(相当大的)类,里面有所有的服务器数据库访问方法,例如:

    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,并更改使用客户端实体的名称空间。这很难看,因为如果有什么变化,我需要维护这两个类。有没有一种方法可以抽象整个东西,并在双方(客户端和服务器)使用相同的类(位于其他两个项目引用的一个单独的项目中)?

我真的很感谢你的帮助。

最佳,

Antony

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

如果保证数据库相同,为什么需要两组实体?只需使用一个集合,它们就可以互操作。

您可以执行以下操作:

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

然后,在这两个项目的项目属性中,在"生成"answers"条件符合符号"框下,可以为每个项目添加标记。因此,在服务器项目中,添加SERVER,在客户端中添加CLIENT。如果已经有标记,请用分号(;)分隔。

无论你把类放在哪个项目中,都要把它作为链接添加到第二个项目中。例如,如果类文件位于服务器项目中,则在客户端项目中,转到Add->Existing项。选择文件,然后单击Open旁边的箭头,然后单击"添加为链接"。这将确保只有一个副本链接到两个项目。

编译每个令牌时,编译器将查看令牌并对其进行评估,然后在Client项目中使用ClientEntities行,在Server项目中使用ServerEntities行。

如果需要,可以对命名空间执行相同的预处理器指令。这里有一篇MSDN文章解释了指令。