c# - Entity Framework - 如何在多个应用程序之间共享一些表

标签 c# sql-server entity-framework

我们正在尝试找出一种在内部应用程序之间共享表的方法,以便我们可以拥有一组用于用户和部门等常见事物的数据。

如果我们有像这样的简单模型:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public virtual IQueryable<Department> Departments { get; set; }
}

public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual IQueryable<User> Users { get; set; }
}

现在我们一直在为他们使用的每个应用程序复制用户(和部门,以及用户-> 部门映射),这正在成为维护的噩梦。

我们如何才能在具有完全不同的模型和数据的多个应用程序之间共享几个表?

是否会对这些模型使用从表(仍然在空间上重复),主表在更新时会更新所有从表?

我们研究过使用 EF 6 中的 Multi-Tenancy 功能,但这似乎只是创建新的用户表,而不是能够在不同的应用程序之间共享单个用户表。有没有办法使用共享表?

编辑:

我们需要能够通过外键引用用户/部门,并希望为两个不同的应用程序提供类似的东西:

public class AppBHuzzah
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

public class AppAFoo
{
    public int Id { get; set; }
    public DateTime DateTime { get; set; }
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

最佳答案

尝试在应用程序之间共享数据库对象,尤其是当共享的对象包含关键数据时,可能会导致更多的困惑和麻烦。因此,为了长期利益,以稍微不同但架构可扩展的方式解决这个问题可能是有用的。

对于您的每个应用程序,清楚什么是主数据以及什么是交易数据,您将受益匪浅。笼统地说,主数据 将涵盖企业内的所有名词。这通常是指开展业务所需的人员、地点和事物。通常,用户和部门是主数据的一部分。识别主数据的简单方法是从多个应用程序的角度查看数据,然后查看数据是否应该对所有应用程序具有相同的语义。另一方面,交易数据将涵盖所有交易。对于外部系统,这可能是订单、付款、发票等。对于内部应用,这可能是费用报告、时间表、工资单等。

一旦您清楚了这一点,就可以使用通常称为主数据维护 (MDM) 的学科所涵盖的众所周知的技术来管理主数据。在应用主数据维护原则时,您会做的一些事情是:

  1. 每种类型的主数据必须仅由单个系统管理(创建、更新、删除、审计和存档)。不得允许多个应用程序管理主数据,因为这可能导致数据不一致和错误处理。
  2. 需要访问主数据的应用程序必须通过对负责所需主数据的 MDM 应用程序进行 API 调用来实现。这确保了事务一致性、数据依赖性、可重用性等。

企业没有必要拥有单一的MDM系统。不同类型的主数据可以由不同的 MDM 系统管理,只要它们之间没有重叠并且它们的角色划分清楚即可。 MDM 系统也可能不会过于复杂。例如,在我以前的一个角色中,我设计了一个数据访问框架,它在许多应用程序想要连接的庞大数据库模式之上使用 Oracle 存储过程。其中许多应用程序非常老旧,只能直接调用数据库代码,这就是为什么该解决方案设计为使用存储过程的原因。我们有一个大型 DBA 池,可以在 3 周内实现该解决方案。之后,我们将 Mule ESB 置于存储过程之上,为在 Java 和 .NET 平台上编写的应用程序提供更现代的 API(XML、JSON、BSON、SOAP)。每个消费者应用程序使用最适合其环境的技术获得自己的系统 View 。

关于c# - Entity Framework - 如何在多个应用程序之间共享一些表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736796/

相关文章:

sql - SQL查询结果如何插入临时表?

c# - 插入新记录前检查记录是否存在

azure - "Login failed for user"在 Azure SQL 中为 "The underlying provider failed on Open"

c# - 在 C# 中将 foreach 与两种类型的条件一起使用

C# 声明变量时转义字符串标识符

sql - 查找并替换 LIKE sql 数据

c# - 以 yyyy/MM/dd HH :mm:ss cause validation error in asp.net mvc 格式保存日期时间

C# 空合并运算符与空集合和空集合之间的 OR 运算符结合时的行为不同

c# - 防止linq组中的重复和并加入

c# - Func<t, bool> vs C# lambda 中的手动表达式性能