2012-10-04 17 views
10

EF, güncellemelerin kaybolmasına izin veren eşzamanlılık kontrolü (son yazma kazancı) anlamına gelir. İyimser eş zamanlılık denetimlerini zorunlu kılmak, ConcerrencyMode = bir RowVersion sütunu üzerinde sabitlenerek açıkça yapılandırılabilir.Ayar nasıl otomatik hale getirilir ConcurrencyMode = Tüm RowVersion sütunlarında sabitlendi?

Tüm tablolarda ConcurrencyMode = RowVersion sütunlarında sabit ayarını nasıl otomatikleştirebiliriz? Bir EF modelini bir veritabanından yeniden oluştururken bunu manuel olarak yapmak zorunda kalırsak, eşzamanlılık kontrolü olmadan çalışmayı unutmak riskini taşırız.

+1

Bir XSLT için çalışıyor? –

+1

beni kaçan bir şey yerleşiği, Kongre tarafından belki bir şey için umuyordum. Bu standart bir şarttır. Çoğu DB uygulaması eşzamanlılık kontrolü gerektirir. Böyle bir temel özellik yok neden –

+1

anlamıyorum. EF CodePlex bir özellik isteği Yapılan [ayarı ConcurrencyMode otomatik hale = Sabit] (http://entityframework.codeplex.com/workitem/588) –

cevap

6

Bu Mohamed Cassim tarafından cevap benzer, ama tasarımcı özelliklerin sırasını değiştirmek gibi, yerine yerine dize, arama ve değiştirme öznitelik XML kullanmak kodu veya diğer özellikleri güncelledik farklı değerlere sahip olabilir.

Bunu FixVersionColumnConcurrencyMode.cs olarak kaydedin, csc FixVersionColumnConcurrencyMode.cs çalıştırın ve elde edilen FixVersionColumnConcurrencyMode.exe dosyasını .edmx dosyasıyla aynı klasörde çalıştırın. Ayrıca projenin post inşa çalışmasını da yapabilirsiniz.

+0

nereye cümle başta değiştirmeyi düşünün 'nerede el.Attribute ("Ad")! = Null && el.Attribute ("Ad"). Value.Contains ("rowversion")' daha büyük bir spektrumunu kapsayacak şekilde sütun adları. –

1

Ben kendim yapmadım (henüz, ama muhtemelen birazdan gerekecektir), ancak .edmx'den kod üretmek için kullanılan aracı değiştirmek mümkün olmalıdır.

Here, VS2008 için açıklayan bir makaledir. Sanırım süreç VS2010 ve VS2012 için aynı olacak.

Şu anda emin değilim, bu ConcurrencyMode ile herhangi bir şekilde muck yapmak mümkün olsun.

4

EF6'de, tasarımcı, veritabanından bir model oluştururken ConcurrencyMode = rowed row sütunlarına sabitlenecektir. Designer: Automate setting ConcurrencyMode=Fixed on rowversion columns. O zamana kadar bunu el ile yapmak zorundayız. Bu Özelliği ben DB Önce oluşturduktan sonra EDMX güncellemek için hızlı bir konsol uygulaması kadar çırpılmış 6.

EF 5 veya EF için civarında olduğu gitmiyor gibi

+1

Maalesef, RoMiller tarafından yayınlanan en son durum yayınlandı: "Biz, EF6'daki tasarımcıya sadece minimum düzeyde değişiklikler yapıyoruz, çünkü kod tabanını hala açık kaynağa dönüştürüyoruz. Bir sonraki sürüm için bu hatayı düşünün. " – Rick

4

görünüyor.

Dosyayı sadece edmx dosyanızın dizinine bırakın ve her yenileme işleminden sonra çalıştırın.

aşağıdaki sütunların herhangi için çalışacak mı:

RowVersion timestamp NOT NULL 
rowversion timestamp NOT NULL 
RowVer  timestamp NOT NULL 
rowver  timestamp NOT NULL 

Sen https://dl.dropbox.com/u/3576345/EFConcurrencyFixed.exe

burada konsol uygulamasını almak veya kendi konsol uygulamasında Bu kod parçasını kullanabilir.

class Program 
{ 
    static Dictionary<string, string> replacements = new Dictionary<string, string>() 
    { 
     { "<Property Type=\"Binary\" Name=\"RowVersion\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Type=\"Binary\" Name=\"RowVersion\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Type=\"Binary\" Name=\"rowversion\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Type=\"Binary\" Name=\"rowversion\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Type=\"Binary\" Name=\"RowVer\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Type=\"Binary\" Name=\"RowVer\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Type=\"Binary\" Name=\"rowver\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Type=\"Binary\" Name=\"rowver\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 
    }; 

    static void Main(string[] args) 
    { 
     // find all .edmx 
     string directoryPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
     foreach (var file in Directory.GetFiles(directoryPath)) 
     { 
      // only edmx 
      if (!file.EndsWith(".edmx")) 
       continue; 

      // read file 
      var fileContents = System.IO.File.ReadAllText(file); 

      // replace lines 
      foreach (var item in replacements) 
       fileContents = fileContents.Replace(item.Key, item.Value); 

      // overwite file 
      System.IO.File.WriteAllText(file, fileContents); 
     } 
    } 
} 
1

, sonra sonra kodda tarihi önce, modelinizi güncellemek her zaman, (bazı sürüm kontrol hayat TFS kurulum varsayarak) En son sürümle karşılaştır ve birleştirme buna göre değişir.Bu şekilde her satırı tek tek güncellemeniz gerekmez. En iyi yol değil, ama el ile yapmaktan daha iyi.

0

Bu Mohamed Cassim cevaptır ama senin inşa sürecinde Ef6

static Dictionary<string, string> replacements = new Dictionary<string, string>() 
    { 
     { "<Property Name=\"RowVersion\" Type=\"Binary\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Name=\"RowVersion\" Type=\"Binary\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Name=\"rowversion\" Type=\"Binary\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Name=\"rowversion\" Type=\"Binary\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Name=\"RowVer\" Type=\"Binary\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Name=\"RowVer\" Type=\"Binary\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Name=\"rowver\" Type=\"Binary\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Name=\"rowver\" Type=\"Binary\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Name=\"RowVersion\" Type=\"Binary\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Name=\"RowVersion\" Type=\"Binary\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Name=\"rowversion\" Type=\"Binary\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Name=\"rowversion\" Type=\"Binary\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Name=\"RowVer\" Type=\"Binary\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Name=\"RowVer\" Type=\"Binary\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 

     { "<Property Name=\"rowver\" Type=\"Binary\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />", 
      "<Property Name=\"rowver\" Type=\"Binary\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"}, 
    }; 

    static void Main(string[] args) 
    { 
     // find all .edmx 
     string directoryPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
     foreach (var file in Directory.GetFiles(directoryPath)) 
     { 
      // only edmx 
      if (!file.EndsWith(".edmx")) 
       continue; 

      Console.WriteLine("File Name Found : " + file); 

      // read file 
      var fileContents = File.ReadAllText(file); 

      // replace lines 
      foreach (var item in replacements) 
       fileContents = fileContents.Replace(item.Key, item.Value); 

      // overwite file 
      File.WriteAllText(file, fileContents); 

      Console.WriteLine("\nFile : " + file + "Changed"); 
     } 
    } 
İlgili konular