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

时间:2015-04-06 16:50:11

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

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

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

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

Simple Table Design

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

不可能。

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

抽象出你的顾虑,这样你就可以使用单一的语境。但是,如果你已经开始使用两个上下文并且需要插入数据,则必须在代码中自己维护这些关系。例如,您可以为依赖实体覆盖ValidateEntity,以便它检查其他上下文并验证所需实体是否存在。这会增加许多复杂性,因为您需要确保以正确的顺序调用保存更改(即在保存从属实体上下文之前保存所需的实体上下文),并且还可以使用TransactionScopes添加一些snafus。我不知道两个数据库中的事务将如何回滚。

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

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