【问题标题】:Using Entity Framework in a modular application在模块化应用程序中使用实体框架
【发布时间】:2014-04-09 19:43:15
【问题描述】:

我目前正在开发一个高度模块化的 MVC 项目。例如,我想要一个用户模块、一个菜单模块和一个页面模块。

由于模块需要在不同的 Visual Studio 解决方案中高度可重用,我为每个模块创建单独的项目。

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

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

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

有人知道如何跨模块/dbContexts 创建外键吗?

【问题讨论】:

    标签: entity-framework modular-design


    【解决方案1】:

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

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

    Service - 包含操作数据的接口和类的项目。例如,对于您的 User 实体(和相关项目),您可能有这样的:

    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 程序集。

    【讨论】:

    • 感谢您的回复,您的解决方案肯定会奏效。但不幸的是,我的情况并非如此。我希望能够在不更改任何其他内容(您的数据层)的情况下在模块中工作。我应该只能使用其他模块的东西。
    • @Matthias - 那么恐怕我不明白你对Module 的定义是什么以及为什么你的模块不能访问完整的服务层,只能使用他们拥有的存储库具体需要。
    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多