【问题标题】:Sharing DB Access Methods between Client and Server in Entity Framework (C#.Net)在实体框架(C#.Net)中的客户端和服务器之间共享数据库访问方法
【发布时间】:2012-04-04 15:55:41
【问题描述】:

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

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

非常感谢您的帮助。

最好的,

安东尼

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,大卫。我不确定我的场景是否可行,但它确实有效。我创建了一个单独的项目,其中包含所有生成的实体。我还编写了自己的 DbContext 类,而不是使用自动生成的类。该项目还包含我的类以及所有数据库操作。在此类的构造函数中,我可以在服务器和客户端之间进行选择,因此所有方法都为某个数据库使用正确的连接字符串。它就像一个魅力 :) 再次感谢大卫!
    【解决方案2】:

    您可以执行以下操作:

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

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

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

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

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

    【讨论】:

    • 安东尼,我看你是一个全新的用户。如果这回答了您的问题,请选择它旁边的绿色复选标记以接受答案。
    • 谢谢你的回答,克里斯!我不知道,很有趣。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2012-11-01
    相关资源
    最近更新 更多