哪些.NET ORM对复合键有很好的支持

时间:2013-01-09 07:54:50

标签: c# orm composite-key

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

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

性能和吞吐量对此应用程序非常重要。

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

1 个答案:

答案 0 :(得分: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; }
}

... Code First方法的配置,使用流畅的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和复合键的任何性能问题。我相信,这是数据库引擎的责任。