业务数据和身份的不同表或不同数据库

Lok*_*oki 1 database asp.net-mvc-5 asp.net-identity

我通过Apress - Pro Asp.Net MVC 5和Identity Framework的免费章节阅读,现在,我想创建一个包含一些数据和身份的小型示例应用程序.

后来我想对Windows Azure进行测试部署.

现在,我应该为此应用程序创建一个单独的数据库,包含所有数据(产品,无论如何,IdentityData(用户帐户,Oauth链接...))还是创建两个数据库会更好?

我知道,如果我创建两个,我将能够为其他MVC应用程序使用相同的Identity-Data,但是对于MVC是否有某种最佳实践?

Chr*_*att 7

在这个领域,本身并没有"最佳实践".这取决于您的个人应用程序的需求.我可以告诉你的是,如果你选择使用多个数据库,你最终会得到一个有点破碎的应用程序.这听起来很糟糕,但请记住,在某些情况下这是一个有效的选择.我的意思是,如果您要将Identity与应用程序的其余部分分开,需要两个数据库和两个上下文,那么就无法将您ApplicationUser与应用程序中的任何其他对象相关联.

例如,假设您创建了一个评论网站.Review将是您的应用程序上下文中的类,并且ApplicationUser当然是您的Identity上下文中的类.你永远不可能做到这样的事情:

public class Review
{
    ...

    public virtual ApplicationUser ReviewedBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这通常会导致在评论表上创建一个外键,指向users表中的一行.但是,由于这两个表位于不同的数据库中,因此这是不可能的.实际上,如果您要执行此类操作,Entity Framework将实现此问题,并实际附加ApplicationUser到您的应用程序上下文并尝试在应用程序的数据库中为其生成表.

但是,你可以做的只是存储用户的id:

public string ReviewedById { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,这也不是外键.如果您需要用户实例,则必须执行两个步骤:

var review = appContext.Reviews.Find(reviewId);
var user = indentityContext.Users.Find(review.ReviewedById);
Run Code Online (Sandbox Code Playgroud)

一般来说,最好将所有应用程序数据保存在一起,包括Identity等.但是,如果你不能,或者有一个商业案例排除这种情况,你仍然可以做你需要做的任何事情,它只会变得更加艰巨并导致更多的查询.