ASP.NET MVC5实体设计不同数据库中的链接表

ASP.NET MVC5实体设计不同数据库中的链接表,asp.net,asp.net-mvc,entity-framework-6,Asp.net,Asp.net Mvc,Entity Framework 6,我正在使用ASP.NET和MVC5进行数据库第一次设计。为了学习这一点,我已经学习了几本教程,在每一本教程中,我都会在一个与其他应用程序数据完全不同的数据库中创建与安全相关的表用户、角色等。这不是一个问题,但是我似乎不知道如何在经常需要包含UserId的应用程序表和AspNetUsers表之间创建关系。我在网上搜索了一些例子,但没有找到 我附上了一个非常简单的例子;我需要将表AspNetUsers中的特定用户链接到表Company中的特定公司的表。如您所见,我知道如何在这个新表和Company表

我正在使用ASP.NET和MVC5进行数据库第一次设计。为了学习这一点,我已经学习了几本教程,在每一本教程中,我都会在一个与其他应用程序数据完全不同的数据库中创建与安全相关的表用户、角色等。这不是一个问题,但是我似乎不知道如何在经常需要包含UserId的应用程序表和AspNetUsers表之间创建关系。我在网上搜索了一些例子,但没有找到

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

有人能帮我理解这是怎么做到的吗?谢谢


你不能。外键不能跨越数据库,因此无法在两个独立数据库中的两个实体之间创建硬关系。您所能做的就是存储该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; }
}
不可能

要获得最佳解决方案,您可能需要这样做:

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

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


不过,说真的,我强烈建议将其从数据库中提取出来。

我很高兴我这样问。对我来说,这似乎是最简单的解决方案,因为我刚刚学习的是找出本教程中导致我最终在两个独立数据库中存储数据的原因,并停止这样做。我猜这与我在实体数据模型向导中选择的数据连接有关。是这样吗?我应该选择默认连接使用的数据库,对吗?我明白你在说什么了。当您第一次创建MVC应用程序时,它会询问您是否要更改身份验证。默认情况下,您将获得个人用户帐户,该帐户首先使用实体框架代码并为您生成数据库。您会注意到在webconfig中有一个mdf文件的默认连接字符串。只要创建数据库所需的表,就可以将该连接字符串指向数据库。或者,您可以在c中编辑dbcontext以使用您的连接字符串并删除默认的连接字符串。谢谢Chris。既然我是这方面的新手,做我在这篇评论中写的事情会更容易吗?
var userIds = someCompany.UserCompanies.Select(m => m.UserId);
var users = userContext.Users.Where(m => userIds.Contains(m.Id));