-1

我们有一个大型现有数据库,几乎完全使用复合主键和外键。我们的任务是编写一个与该数据库(在 SQL Server 2012 上)对话的大型 C# 应用程序。

我们正在考虑使用 ORM,但我所知道的大多数 ORM 似乎不鼓励(或明确不支持)使用复合键(例如NHibernateMassivePetaPoco等)。

性能和吞吐量对于此应用程序很重要。

哪些 ORM(如果有)对复合键有很好的支持,并且启动性能很好?你会推荐哪个?

4

1 回答 1

1

实体框架支持复合键。例如,这是一个具有复合键的实体:

public class MyEntity
{
    public int NodeId { get; set; } // this is a part of entity key
    public int ItemId { get; set; } // this is a part of entity key
    public string Name { get; set; }
}

...其代码优先方法的配置,使用流利的 API:

internal sealed class MyEntityConfiguration : EntityTypeConfiguration<MyEntity>
{
        public MyEntityConfiguration()
        {
            // this is a composite key configuration
            HasKey(_ => new { _.NodeId, _.ItemId });

            Property(_ => _.NodeId);
            Property(_ => _.ItemId);
            Property(_ => _.Name);
        }
}

...和查询示例:

context.MyEntities.SingleOrDefault(myEntity => myEntity.NodeId == 1 && myEntity.ItemId == 1);

EF 中的复合键有什么不好的地方:

  • 您不能为键声明单独的类型。因此,如果您的密钥包含三个属性,那么您将拥有三个属性而不是一个密钥属性;
  • 如果允许对现有实体的密钥进行更改(您可以更改一个密钥属性,而忘记另一个),您应该编写自己的修复代码以实现密钥一致性。

我不知道 EF 和复合键的任何性能问题。我相信,这是数据库引擎的责任。

于 2013-01-09T08:24:25.347 回答