MVC /实体代码 - 首先在它们之间具有引用完整性的多个上下文

Mat*_*ley 6 c# asp.net-mvc entity-framework entity-framework-6 entity-framework-6.1

我在使用同一个数据库进行合作的两个上下文时遇到了一些困难.这是场景:

在使用EF 6 Code-First的MVC应用程序中,有一个具有两个上下文的数据库. - 第一个上下文是具有自定义ApplicationUser对象的ApplicationIdentity上下文. - 第二个上下文是业务上下文,它包含一个Team模型:

 public class Team
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public ApplicationUser TeamLeader { get; set; }

    public string Name { get; set; }

    public virtual ICollection<ApplicationUser> TeamMembers { get; set; }

    public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

管理迁移一直很困难,尽管这个答案已经证明非常有用:同一个数据库中的多个DB上下文和EF 6中的应用程序以及代码优先迁移

问题是Identity上下文一直试图在其迁移中创建Team表,然后Business Context在创建,填充和保存新团队时不断尝试创建重复的ApplicationUser记录.

我想要的是适用以下规则:

  • IdentityContext仅负责创建和更改Identity表的模式.它不知道对象(即团队)在其责任范围之外.
  • 业务上下文负责其对象与IdentityObject之间的引用完整性,但它可能无法编辑Identity表中的记录.如果用户不存在,请输入错误,不要创建.

有没有人有任何关于如何让这些背景互相玩耍的提示?我真的不想破坏Identity对象和业务对象之间的引用完整性.

Jot*_*aBe 2

您想要做的事情看起来像“DDD 有界上下文”。

解释如何使用它们有点长,但这里有一些提示:

  • 用于modelBuilder.Ignore<EntityType>();从模型中排除自动添加到上下文中的相关实体
  • 必要时在每个模型中使用不同的类,并适当地映射它们。我的意思是仅映射部分列的类。用于modelBuilder配置它们
  • 必要时使用只读导航属性只读属性

这是 Julie Lerman 撰写的一篇非常有趣的文章:Data Points - Shrink EF Models with DDD Bounded Contexts