在实体框架(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
如果保证数据库相同,为什么需要两组实体?只需使用一个集合,它们就可以互操作。
您可以执行以下操作:
#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文章解释了指令。