2015-04-06 82 views
0

我正在使用ASP.NET和MVC5的数据库优先设计。为了学习这些知识,我遵循了几个教程,并且在其中的每一个教程中,我都将与安全相关的表(用户,角色等)放在与其他应用程序数据完全分离的数据库中。这不是问题,但我似乎无法弄清楚如何在我的应用程序表(通常需要包含UserId)和AspNetUsers表之间建立关系。我在网上搜索例子,找不到任何。ASP.NET MVC5实体设计在不同数据库中链接表

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

有人能帮我理解这是怎么完成的吗?谢谢!!

Simple Table Design

回答

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)); 
+0

谢谢克里斯。既然我是这个新手,是否会更容易做我在这个评论中写的内容? http://stackoverflow.com/questions/29475626/asp-net-mvc5-entity-design-linking-tables-in-different-databases#comment47120748_29478989 – MeTP

0

不可能的。

对于你可能想要去与这样的事情最好的解决办法:那抽象了您的问题,所以你可以使用一个上下文Multiple contexts with Entity Framework 6, reference entities across dbcontexts

。但是,如果您在使用两个上下文并且需要插入数据时死心塌地,那么您将不得不在代码中维护这些关系。例如,您可以覆盖依赖实体的ValidateEntity,以便它检查其他上下文并验证所需实体是否存在。但是这会增加很多复杂性,因为您需要确保以正确的顺序调用保存更改(即在保存依赖实体上下文之前保存所需的实体上下文),并且还可以为TransactionScopes添加一些备份。我不知道跨两个数据库的事务会如何回滚。

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

尽管如此,我强烈建议在数据库中将其抽象化。

+0

我很高兴我问。对我来说,这似乎是最简单的解决方案(因为我只是在学习)是弄清楚本教程中的内容是什么导致我最终在两个单独的数据库中获得数据并停止这样做。我猜测它与我在实体数据模型向导中选择的数据连接有关。这是正确的吗?我应该继续,并选择我的默认连接使用的相同数据库,对吧? http://www.asp.net/mvc/overview/getting-started/database-first-development/creating-the-web-application – MeTP

+0

我明白你现在的意思了。当您第一次创建MVC应用程序时,会询问您是否要更改身份验证。默认情况下,您会获得个人用户帐户,它首先使用实体​​框架代码并为您生成数据库。你会注意到在你的webconfig里有一个默认的连接字符串到一个mdf文件。只要您创建所需的表格,您就可以将该连接字符串指向您的数据库。或者,您可以编辑c#中的dbcontext来使用您的连接字符串并删除默认的。 – BoredBlazer