2013-03-14 67 views
5

我試圖強制執行一個列的唯一約束,首先使用流利配置的代碼。有什麼比在業務邏輯實現它,或者使用喜歡的東西下面EF代碼第一流暢的API定義了唯一的約束

context.ObjectContext.ExecuteStoreCommand("CREATE UNIQUE CONSTRAINT..."); 

或者我在想,如果這是不可能實現使用流利的配置獨特的約束更好的辦法?

編輯:

它確認這是不可能用流利的配置。但是,我又想知道做這件事的最好方法是什麼?並想知道EF不支持這一點的原因。

+1

該團隊正在考慮:http://entityframework.codeplex.com/workitem/299 – ErikEJ 2013-03-19 17:59:59

回答

1

該問題以前出現用流利的API無法實現獨特的約束。

所以,你所用的方法是正確的!

+0

感謝您的回覆。但是如果我使用命令執行它,它將取決於我的數據庫實現。這是我不想要的。 – Geethanga 2013-03-19 14:03:17

2

在本例中,您可以看到如何定義唯一鍵屬性並將其用於任何實體。

http://code.msdn.microsoft.com/windowsdesktop/CSASPNETUniqueConstraintInE-d357224a

+1

感謝您的回覆伊姆蘭。其實這是一個很好的方法來做到這一點。但最終它執行的是供應商特定的SQL語句,所以如果我將數據庫更改爲不同的供應商,我將最終修改代碼。但我同意我只能修改一個地方。 – Geethanga 2013-07-13 05:42:18

1

這是可能的DbMigrations ...

public override void Up() 
{ 
    CreateIndex("dbo.MyTableName", "MyColumnName", unique: true); 
} 
+0

是的,我也寫了一篇博客文章,你可以在這裏找到它(http://goo.gl/Ks9HZI)。但我最初的問題是,如果有一種方法可以通過Fluent API來實現。 – Geethanga 2014-02-15 05:06:18

+0

將自定義代碼添加到遷移中的問題是,當您決定清除/合併/重新生成遷移時,您可能會丟失該代碼。我建議將所有配置保存在EntityTypeConfiguration類中。檢查我的答案如何:http://stackoverflow.com/a/25779397/111438。 – niaher 2014-09-11 05:02:52

1

它可以用自定義擴展方法來完成:

using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity.Infrastructure.Annotations; 
using System.Data.Entity.ModelConfiguration.Configuration; 

internal static class TypeConfigurationExtensions 
{ 
    public static PrimitivePropertyConfiguration HasUniqueIndexAnnotation(
     this PrimitivePropertyConfiguration property, 
     string indexName, 
     int columnOrder = 0) 
    { 
     var indexAttribute = new IndexAttribute(indexName, columnOrder) { IsUnique = true }; 
     var indexAnnotation = new IndexAnnotation(indexAttribute); 

     return property.HasColumnAnnotation("Index", indexAnnotation); 
    } 
} 

這裏檢查完整的答案:https://stackoverflow.com/a/25779348/111438

+0

2列如何共同形成一個獨特的關鍵? – 2015-08-19 08:51:41