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

时间:2015-02-26 14:05:28

标签: database asp.net-mvc-5 asp.net-identity

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

稍后我想对Windows Azure进行测试部署。

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

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

1 个答案:

答案 0 :(得分:6)

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

例如,我们假设您创建了一个评论网站。 Review将是您的应用程序上下文中的一个类,ApplicationUser当然是您的Identity上下文中的一个类。你永远不会做类似的事情:

public class Review
{
    ...

    public virtual ApplicationUser ReviewedBy { get; set; }
}

这通常会导致在评论表上创建外键,指向users表中的一行。但是,由于这两个表位于不同的数据库中,因此无法实现。事实上,如果你要做这样的事情,实体框架会意识到这个问题,并且实际上将ApplicationUser附加到你的应用程序上下文并尝试在你的应用程序的数据库中为它生成一个表。

但是,您可以做的只是存储用户的ID:

public string ReviewedById { get; set; }

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

var review = appContext.Reviews.Find(reviewId);
var user = indentityContext.Users.Find(review.ReviewedById);

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