Entity framework 唯一复合密钥的EF CodeFirst验证

Entity framework 唯一复合密钥的EF CodeFirst验证,entity-framework,entity-framework-4,ef-code-first,data-annotations,Entity Framework,Entity Framework 4,Ef Code First,Data Annotations,我有一个表,其中包含一个Id列作为主键。还需要在另外两列(实际上是FKs)上强制唯一性。在Sql Server中,我可以在这两列上创建一个UniqueKey 在EF端我可以做些什么,以便它可以验证这两个字段的唯一性?EF不支持唯一键,因此最好的解决方法是在数据库中使用唯一键,并在保存期间捕获异常。如果需要EF在数据库创建期间创建唯一密钥,则可以 如果你想在应用程序中进行一些验证,你需要执行一些查询并检查这些数据是否还不存在,但是你仍然需要使用前一个建议来捕获异常,因为另一个线程/进程/用户可以在

我有一个表,其中包含一个Id列作为主键。还需要在另外两列(实际上是FKs)上强制唯一性。在Sql Server中,我可以在这两列上创建一个UniqueKey


在EF端我可以做些什么,以便它可以验证这两个字段的唯一性?

EF不支持唯一键,因此最好的解决方法是在数据库中使用唯一键,并在保存期间捕获异常。如果需要EF在数据库创建期间创建唯一密钥,则可以


如果你想在应用程序中进行一些验证,你需要执行一些查询并检查这些数据是否还不存在,但是你仍然需要使用前一个建议来捕获异常,因为另一个线程/进程/用户可以在你的查询和保存更改之间创建这样的数据。

EF不支持唯一键,所以最好的解决方法是在数据库中使用唯一键,并在保存期间捕获异常。如果需要EF在数据库创建期间创建唯一密钥,则可以


如果你想在应用程序中进行一些验证,你需要执行一些查询并检查这些数据是否还不存在,但是你仍然需要使用前一个建议,因为另一个线程/进程/用户可以在你的查询和保存更改之间创建这样的数据。

在你的POCO类中标记每个需要作为键唯一的列。例如:

public MyPocoClass {
   [Key, Column(Order = 0)]
   public int Id { get; set; }

   [Key, Column(Order = 1)]
   public int Col2name { get; set; }


   [Key, Column(Order = 2)]
   public int Col3name { get; set; }
}
设置列顺序非常有用,这样您的主键列都会一起显示在sql db中

如果列是其他实体框架代码第一类的外键,则只需将属性命名为tablename\u tableId,其余的将由EF完成。即

public anotherClass {
       public int Id { get; set; }

       public int MyPocoClass_Id { get; set; } //this is a foreign key

    }

在POCO类中,将每个需要唯一的列标记为键。例如:

public MyPocoClass {
   [Key, Column(Order = 0)]
   public int Id { get; set; }

   [Key, Column(Order = 1)]
   public int Col2name { get; set; }


   [Key, Column(Order = 2)]
   public int Col3name { get; set; }
}
设置列顺序非常有用,这样您的主键列都会一起显示在sql db中

如果列是其他实体框架代码第一类的外键,则只需将属性命名为tablename\u tableId,其余的将由EF完成。即

public anotherClass {
       public int Id { get; set; }

       public int MyPocoClass_Id { get; set; } //this is a foreign key

    }

你所说的:EF将完成剩下的工作是什么意思?我想你误解了我的问题。如何在客户端检查是否有两条记录具有相同的Col2Name和Col3Name值?实体框架将涵盖外键的验证,如果您尝试插入非唯一的行或外键在另一个表中不作为键存在,则上下文将引发异常。有帮助吗?没有。如果我到了对数据库执行查询的地步,这意味着EF根本不处理验证。我的问题是:我可以在EF/客户端做些什么来验证数据。我不确定您想要实现什么。您将不得不以您选择的任何方式与数据库联系。要检查主键/外键是否有效,需要知道数据库表包含的内容。如果要将表作为集合加载,然后对其进行迭代以检查键的有效性,可以,但仍然需要访问数据。我不是要验证FK是否有效,而是要验证值与两个属性的值组合的唯一性。在我的例子中,这两个属性是FKs,但不一定总是这样。如果出现异常,验证就永远不会发生。这个链接谈到基于属性的验证,我对实体级别的唯一性验证感兴趣。你说的:EF将完成其余的工作是什么意思?我想你误解了我的问题。如何在客户端检查是否有两条记录具有相同的Col2Name和Col3Name值?实体框架将涵盖外键的验证,如果您尝试插入非唯一的行或外键在另一个表中不作为键存在,则上下文将引发异常。有帮助吗?没有。如果我到了对数据库执行查询的地步,这意味着EF根本不处理验证。我的问题是:我可以在EF/客户端做些什么来验证数据。我不确定您想要实现什么。您将不得不以您选择的任何方式与数据库联系。要检查主键/外键是否有效,需要知道数据库表包含的内容。如果要将表作为集合加载,然后对其进行迭代以检查键的有效性,可以,但仍然需要访问数据。我不是要验证FK是否有效,而是要验证值与两个属性的值组合的唯一性。在我的例子中,这两个属性是FKs,但不一定总是这样。如果出现异常,验证就永远不会发生。这个链接谈到基于属性的验证,我对实体级别的唯一性验证感兴趣。嗨,在我发布这个问题之前,我已经看过你链接到的帖子了。执行一些查询是什么意思?我在这里看到两个可能的问题:1)我需要将新值与数据库中的现有值进行比较,2)我在内存数据中有重复的值,因此插入/更新第二条记录将失败。您是否认为DataAnnotation在此场景中不适用?Data Annotation不适用,因为您可以在不同的上下文实例中具有相同的内存值。在这种情况下,数据注释验证将通过,但真正的验证将只在数据库中进行。嗨,在我发布这个问题之前,我已经看过了你链接到的帖子。执行一些查询是什么意思?我在这里看到两个可能的问题:1)我需要将新值与数据库中的现有值进行比较,2)我在内存数据中有重复的值,因此插入/更新第二条记录将失败。您是否认为DataAnnotation在此场景中不适用?Data Annotation不适用,因为您可以在中的内存中具有相同的值