这是一种客户端 - 服务器架构问题。
我的解决方案中有两个项目:一个项目用于客户端使用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并更改名称空间以使用客户端实体。这非常难看,因为如果发生变化,我需要维护这两个类。有没有办法抽象整个事物并在两端(客户端和服务器)使用相同的类(位于另外两个项目引用的单独的项目中)?
我真的很感谢你的帮助。
最佳,
安东尼
答案 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)
如果保证数据库完全相同,为什么还需要两组实体?只需使用一套就可以实现互操作。