我正在使用ASP.NET和MVC5进行Database First设计。我已经学习了几个教程,以便了解这一点,并且在每一个教程中,我最终都将与安全相关的表(用户,角色等)放在与我的其他应用程序数据完全独立的数据库中。这不是问题,但我似乎无法弄清楚如何在我的应用程序表(通常需要包含UserId)和AspNetUsers表之间创建关系。我在网上搜索了一些示例,无法找到。
我附上了一个非常简单的例子;我需要将特定用户(从表AspNetUsers)链接到特定公司(来自表公司)的表。如您所见,我知道如何在这个新表和Company表之间创建关系,但是如何在这个新表和AspNetUsers表之间创建关系呢?
有人可以帮我理解这是怎么做到的吗?谢谢!
答案 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。我不知道两个数据库中的事务将如何回滚。
对于读取,您只需要从两个上下文中读取对象并自己手动构建对象图。
说真的,我强烈建议在数据库中抽象出来。