2014-03-07 58 views
1

我目前正在开发一个应该高度模块化的MVC项目。例如,我想要一个用户模块,一个菜单模块和一个页面模块。在模块化应用程序中使用实体框架

因为这些模块需要在不同的visual studio解决方案中高度重用,所以我为每个模块创建单独的项目。

对于数据库映射,我想利用实体框架。我在每个模块项目中都创建了一个单独的DbContext。每个DbContext都包含与模块关联的实体。

不幸的是,我不能让EF在不同模块/ dbContexts中的实体之间创建外键。

例如: 核心模块包含用户实体 页面模块包含页面实体,该页面实体的作者链接到在核心模块dbContext中定义的用户实体。

有没有人有一个想法,我可以跨模块/ dbContexts创建外键?

回答

1

所有的实体都在同一个数据库中吗?我建议你这样分开你的程序集:

数据 - 包含你的实体框架模型和/或类/实体定义(取决于你使用哪种类型的EF方法)的项目。

服务 - 包含操作数据的接口和类的项目。例如,您的用户实体(以及相关项目),你可能有这样的:

public interface IUser : IDisposable 
{ 
    Data.User Get(int userId); 
    IQueryable<Data.User> GetAll(); 
    //other method definitions for User entity CRUD 
} 

然后,您实现:

public class User : IUser 
{ 
    private readonly DataEntities _dataContext = new DataEntities(); //this is from your EF Data assembly 

    public Data.User Get(int userId) 
    { 
     return _dataContext.Users.FirstOrDefault(u => u.UserId == userId); 
    } 

    public IQueryable<Data.User> GetAll() 
    { 
     return _dataContext.Users; 
    } 

    //other method implementations 

    public void Dispose() 
    { 
     _dataContext.Dispose(); 
    } 
} 

然后,参考既您ServiceData组件在你的模块项目。

+0

感谢您的回复,您的解决方案肯定会奏效。但不幸的是不在我的情况。我希望能够在不改变任何其他内容(您的数据层)的情况下在模块中工作。我应该只能使用其他模块的东西。 – mhtsbt

+0

@Matthias - 那么恐怕我不明白你对'Module'的定义是什么,以及为什么你的模块不能访问完整的服务层,只能使用他们特别需要的存储库。 –

相关问题