有没有一个很好的理由为什么EF无法通过简单地遵循标记字段的声明顺序来确定复合键的顺序?

时间:2015-08-03 15:04:26

标签: c# entity-framework

来自MSDN' Code First Data Annotations

  

当您有复合键时,Entity Framework要求您定义键属性的顺序。您可以使用Column批注指定订单。

我想知道为什么微软没有让EF能够确定复合键顺序,只要没有明确声明 - 只是根据标有[Key]的字段的顺序被声明?< / p>

缺少此功能背后有充分的理由吗?

声明几个复合键的顺序可能很烦人。

2 个答案:

答案 0 :(得分:3)

我认为主要原因是方法的脆弱性。

由于[Key]列可以来自继承层次结构中的不同类,因此需要定义规则以避免歧义。例如,框架设计者需要指定从基类继承的组合键的组件优先于派生类中定义的组件:

class BaseEntity {
    [Key]
    public int KeyPartBase {get;set;}
}
class DerivedEntity : BaseEntity {
    [Key]
    public int KeyPartDerived {get;set;}
}

如果您决定展平您的层次结构,这将导致问题。我们假设有人重构您的代码并不够谨慎,并将KeyPartBase移到KeyPartDerived以下:

class DerivedEntity  {
    [Key]
    public int KeyPartDerived {get;set;}
    [Key]
    public int KeyPartBase {get;set;}
}

此更改对代码部分没有影响,但它会破坏关键部分的顺序,从而导致一个微妙且极难发现的错误。

答案 1 :(得分:2)

  

根据订单标记了[Key]的字段?

我不认为CLI保证 - 除非在内存中使用StructLayoutAttribute命令,或者由反射API返回 - 与源代码中的顺序匹配。