0

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

我的解决方案中有 2 个项目:一个用于客户端的项目使用 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 并更改命名空间以使用客户端实体。这很丑陋,因为如果发生变化,我需要维护这两个类。有没有办法抽象整个事物并在双方(客户端和服务器)上使用相同的类(位于其他两个项目引用的单独项目中)?

我将衷心感谢您的帮助。

最好的,

安东尼

4

2 回答 2

0

您可以执行以下操作:

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

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

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

当每个都被编译时,编译器将查看令牌,评估它们,并将使用ClientEntities客户端项目和ServerEntities服务器项目中的行。

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

于 2012-04-04T16:17:25.600 回答
0

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

于 2012-04-04T16:37:33.237 回答