Entity Framework: EDMX dosyasındaki tüm sütunlar için eşzamanlılık modunu ayarlama

Womanne

Member
Varlık Veri Modeli’ndeki tüm sütunların eşzamanlılık modu özelliğini “Sabit” olarak ayarlayan bir aracın kodu.


Temel ayarda Microsoft Entity Framework, verilere yazma erişimi için “son kazançlar” stratejisini izler. Ancak pratikte bu genellikle uygulanabilir bir seçenek olmadığı gibi kullanıcılar tarafından da kabul edilebilir değildir. Ancak, Entity Framework ile “iyimser kilitlemeyi” (ADO.NET veri kümesinde olduğu gibi) açabilirsiniz.

Kod tabanlı modellemede bu, varlık sınıfı ister kullanıcı tarafından yazılmış ister tersine mühendislik kullanılarak Visual Studio tarafından varolan bir veritabanından oluşturulmuş olsun, ConcurrencyCheckAttribute ile açıklama yoluyla yapılır. “Önce Veritabanı” veya “Önce Model” için “Varlık Veri Modeli” tasarımcısını kullanmak daha can sıkıcıdır: burada yazılım geliştiricinin tasarımcıdaki her özelliği tıklaması ve Eşzamanlılık Modu özelliğini “Sabit” değerine ayarlaması gerekir. Ne yazık ki Microsoft, Entity Framework tasarımcısında Eşzamanlılık Modu özelliği için varsayılan değeri “Sabit” değerine ayarlamak için bir yol oluşturmadı.

Her özellik için eşzamanlılık modunu manuel olarak ayarlamak istemiyorsanız (bu yalnızca can sıkıcı değil, aynı zamanda bir özelliği kolayca gözden kaçırabileceğiniz için hataya açıktır), o zaman EDMX dosyasını değiştiren bir araç yazmanız gerekir. Bu roket bilimi değil, EDMX dosyası XML formatında olduğundan oldukça basit. Çözüm aşağıdaki listede gösterilmiştir. Daha sonra bu kodu ile arayabilirsiniz.

ConcurrencyModeUtil.ChangeConcurrencyMode(@"x:...
Modell.edmx", ConcurrencyMode.Fixed)

Visual Studio’ya proje özelliklerinde derleme öncesi bir olay olarak girilen bir komut satırı uygulamasında. Ve tüm özelliklerin eşzamanlılık modunun doğru şekilde ayarlanmış olması her zaman garanti edilir.

/// <summary>
/// Zur Ausführung zur Entwicklungszeit
/// Ändert alle Propertes im Conceptual Model einer EDMX-Datei
/// auf ConcurrencyMode = fixed oder = none
/// </summary>
/// <param name="edmxPath">Pfad zur EDMX-Datei.</param>
/// <param name="value">ConcurrencyMode none oder fixed.</param>
public static void ChangeConcurrencyMode(string edmxPath,
ConcurrencyMode mode)
{
// öffne EDMX-Datei als XML-Dokument
XDocument xmlDoc = XDocument.Load(edmxPath);

// Suche Element <ConceptualModels>
var conceptualModel = xmlDoc.Descendants().SingleOrDefault
(p => p.Name.LocalName == "ConceptualModels");

// Suche alle Unterelemente <Property>, wo der ConcurrencyMode nicht dem
// gewünschten Wert entspricht
IEnumerable<XElement> properties =
from el in conceptualModel.Descendants()
where el.Name.LocalName == "Property"
&& (string)el.Attribute("ConcurrencyMode") != mode.ToString()
select el;

bool modified = false;

// Setze ConcurrencyMode in den gefundenen Properties
foreach (XElement el in properties)
{
modified = true;
el.SetAttributeValue("ConcurrencyMode", mode.ToString());
Console.WriteLine(el.Attribute("Name") + ": " +
el.Attribute("ConcurrencyMode"));
}

// Speichern, falls es Änderungen gab
if (modified)
{
xmlDoc.Save(edmxPath);
Console.WriteLine("Datei " + edmxPath + " wurde geändert!");
}
}
}
}



()






Haberin Sonu
 
Üst