如何在不同的DbContext上找到的模型之间创建关系?

问题描述 投票:1回答:1

我正在按照DDD模式开发应用程序。

我有以下关于员工管理和用户帐户管理的上下文

员工管理背景

用户帐户管理上下文

这两种情况都在一个单独的项目上。 员工管理项目有以下模型。

public class Employee  
{  
    public int Id { get; private set; }  
    public string Name { get; private set; }  
    public DateTime DateOfBirth { get; private set; }  
}  

用户帐户管理项目具有以下模型。

public class Employee  
{  
    public int Id { get; private set; }  
    public string Name { get; private set; }   
}

public class UserAccount  
{  
    public int Id { get; private set; }  
    public string Username { get; private set; }  
    public string Password { get; private set; }  
}  

员工管理背景

public class EmployeeManagementContext : DbContext  
{  
    public DbSet<Employee> Employees { get; set; }  
}  

用户帐户管理上下文

public class UserAccountManagementContext : DbContext  
{  
    public DbSet<UserAccount> UserAccounts { get; set; }  
}  

我可以通过使用不同的上下文键成功迁移两个上下文,但问题是我松开了Employee和UserAccount模型之间的关系。

Wrong Employee to UserAccount relationship

基本上,我需要在两个模型之间实现的业务规则如下:

员工可能有也可能没有用户帐户。 用户帐户仅由一个员工拥有。

这意味着我应该在Employee和UserAccount之间建立一对一或零关系,如下图所示。

Correct Employee to UserAccount relationship

请忽略错误的关系符号,它似乎是我正在使用的工具的限制,但它是我向你保证的一对一或零关系。

我在UserAccount项目中尝试了以下配置:

public class UserAccountConfiguration : EntityTypeConfiguration<UserAccount>  
{  
    HasKey(x => x.Id);  

    Property(x => x.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);  
}

public class EmployeeConfiguration : EntityTypeConfiguration<Employee>  
{  
    HasKey(x => x.Id);  

    Property(x => x.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);  

    HasOptional(x => x.UserAccount)
        .WithRequired(x => x.Employee);
}  

public class UserAccountManagementContext : DbContext  
{  
    public DbSet<UserAccount> UserAccounts { get; set; }  

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserAccountConfiguration());
        modelBuilder.Configurations.Add(new EmployeeConfiguration());
        base.OnModelCreating(modelBuilder);
    }
}  

由于员工管理项目中的EmployeeManagementContext,上述配置导致错误,因为Employee表已存在。

如果我尝试在员工管理项目的EmployeeConfiguration中添加以下配置,

ToTable( “用户”);

EF不再抱怨并创建一个Users表,然后在Employee和UserAccount之间创建我需要的关系。但问题是,如果我尝试在UserAccountManagementContext中查询Employee / Users,它不包含任何东西,我不认为它的好设计继续创建从原始表派生的较小的表,因为它只会混乱数据库,对吗?...

非常感谢你的帮助,谢谢。

c# entity-framework domain-driven-design
1个回答
2
投票

您应该更多地关注域而不是数据库。

从我所看到的,你有两个聚合(EmployeeUserAccount),在可能的2个有界上下文中(我不能命名它们,因为我没有足够的数据)。通常,不建议在两个聚合之间强制一致地强制使用任何不变量,但也有例外。它们可能在不同的数据库中具有不同的技术。现在让我们看看如何强制执行这两个不变量:

员工可能有也可能没有用户帐户。

这可以使用UserAccountId上的可空Employee建模,而不需要任何低级数据库引用。根据业务规则,当删除UserAccound时(如果这是一个有效的业务操作),使用Saga / Process管理器,您可以在null中将具有此帐户的相应UserAccountId设置为Employee

用户帐户仅由一个员工拥有。

实施这种不变量的最简单方法是技术性的:在UserAccountId上创建一个独特的索引。其他解决方案意味着使用Sagas,但不如此类,例如允许短时间内不变量被打破。

© www.soinside.com 2019 - 2024. All rights reserved.