【问题标题】:ASP.NET MVC5 Entity Design Linking Tables in Different Databases不同数据库中的 ASP.NET MVC5 实体设计链接表
【发布时间】:2015-04-07 04:19:40
【问题描述】:

我正在使用 ASP.NET 和 MVC5 进行数据库优先设计。为了学习这一点,我已经遵循了几个教程,并且在每一个教程中,我最终都会在一个完全独立于我的其他应用程序数据的数据库中获得与安全相关的表(用户、角色等)。这不是问题,但是我似乎无法弄清楚如何在我的应用程序表(例如通常需要包含 UserId)和 AspNetUsers 表之间创建关系。我在网上搜索了示例,但找不到任何示例。

我附上了一个非常简单的例子;我需要将特定用户(来自 AspNetUsers 表)链接到特定公司(来自 Company 表)的表。如您所见,我知道如何创建这个新表和 Company 表之间的关系,但是如何创建这个新表和 AspNetUsers 表之间的关系呢?

有人可以帮助我了解这是如何完成的吗?谢谢!!

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework-6


    【解决方案1】:

    你不能。外键不能跨越数据库,因此无法在两个独立数据库中的两个实体之间创建硬关系。您所能做的就是存储 id,然后在需要该实体时手动向其他数据库查询该 id。

    例如,给定:

    public class Company
    {
        ...
        public virtual ICollection<UserCompany> UserCompanies { get; set; }
    }
    
    public class UserCompany
    {
        [Key]
        public int Id { get; set; }
    
        public int UserId { get; set; }
        // Can't create a foreign key here, because the user table is
        // in another database
    
        [ForeignKey("Company")]
        public int CompanyId { get; set; }
        public virtual Company Company { get; set; }
    }
    

    那么,你可以这样做:

    var userIds = someCompany.UserCompanies.Select(m => m.UserId);
    var users = userContext.Users.Where(m => userIds.Contains(m.Id));
    

    【讨论】:

    【解决方案2】:

    不可能。

    为了获得最佳解决方案,您可能希望使用以下内容:Multiple contexts with Entity Framework 6, reference entities across dbcontexts

    这将您的顾虑抽象化,因此您可以使用单一上下文。但是,如果您死心塌地使用两个上下文并需要插入数据,您将不得不自己在代码中维护这些关系。例如,您可以覆盖依赖实体的 ValidateEntity,以便它检查其他上下文并验证所需实体是否存在。但是,这增加了很多复杂性,因为您需要确保以正确的顺序调用保存更改(即在保存依赖实体上下文之前保存所需的实体上下文),并且它还可能会添加一些事务范围的混乱。我不知道跨两个数据库的事务会被回滚到什么程度。

    不过,对于读取,您只需从两个上下文中读取对象并自己手动构建对象图。

    说真的,我强烈建议在数据库中将其抽象出来。

    【讨论】:

    • 我很高兴我问了。对我来说似乎最简单的解决方案(因为我只是在学习)是找出本教程中导致我最终在两个单独的数据库中得到数据并停止这样做的原因。我猜这与我在实体数据模型向导中选择的数据连接有关。那会是正确的吗?我应该继续选择我的默认连接正在使用的同一个数据库,对吧? asp.net/mvc/overview/getting-started/database-first-development/…
    • 我明白你现在在说什么了。当您第一次创建 MVC 应用程序时,它会询问您是否要更改身份验证。默认情况下,您会获得首先使用实体​​框架代码并为您生成数据库的个人用户帐户。您会注意到在您的 webconfig 中有一个到 mdf 文件的默认连接字符串。只要您创建它需要的表,您就可以将该连接字符串指向您的数据库。或者,您可以在 c# 中编辑 dbcontext 以使用您的连接字符串并删除默认的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2023-04-09
    相关资源
    最近更新 更多