Hızlı Başlangıç: .NET SDK Tablo API'si Azure Cosmos DB ile Cosmos oluşturma
Uygulama hedefı:
tablo API'si
Bu hızlı başlangıçta, bir .NET uygulamasından Azure Cosmos DB Tablo API'si nasıl erişin? Cosmos DB Tablo API'si, uygulamaların yapılandırılmış NoSQL verilerini bulutta depolamasına olanak sağlayan şemasız bir veri deposudur. Veriler şemasız bir tasarımda depolandığı için tabloya yeni öznitelik içeren bir nesne ekleniyorsa yeni özellikler (sütunlar) otomatik olarak tabloya eklenir.
.NET uygulamaları Azure.Data.Tables Cosmos Tablo API'si kullanarak NuGet erişebilirsiniz. Azure.Data.Tables paketi, hem .NET Framework (4.7.2 ve sonrası) hem de .NET Core (2.0 ve sonrası) uygulamalarıyla çalışan bir .NET Standard 2.0 kitaplığıdır.
Önkoşullar
İlkeler hem hem de .NET Core uygulamaları için geçerli olsa da örnek uygulama .NET Core 3.1.NET Framework yazılır. IDE olarak Visual Studio, Mac için Visual Studioveya Visual Studio Code kullanabilirsiniz.
Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Örnek uygulama
Bu öğreticinin örnek uygulaması depodan kopyalanmış veya indirilmiş https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-dotnet olabilir. Hem başlangıç hem de tamamlanmış uygulama örnek depoya dahil edilir.
git clone https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-dotnet
Örnek uygulama, uygulamanın özelliklerini göstermek için örnek olarak hava durumu verilerini Tablo API'si. Hava durumu gözlemlerini temsil eden nesneler Tablo API'si kullanılarak depolanır ve alınır. Bunlar arasında, Tablo API'si'nin şemasız özelliklerini göstermek için ek özelliklere sahip nesneler Tablo API'si.
1 - Azure Cosmos DB hesabı oluşturma
İlk olarak uygulamanıza Cosmos tabloları içeren bir Veritabanı Tabloları API'si hesabı oluşturmanız gerekir. Bu işlem Azure portal, Azure CLI veya Azure PowerShell.
Azure portal veritabanı hesabı oluşturmak için Cosmos izleyin.
2 - Tablo oluşturma
Ardından, Cosmos DB hesabınız içinde, Cosmos için bir tablo oluşturmanız gerekir. Geleneksel veritabanından farklı olarak tablodaki özellikleri (sütunları) değil yalnızca tablonun adını belirtmeniz gerekir. Veriler tablonıza yüklendiğinde özellikler (sütunlar) gerektiğinde otomatik olarak oluşturulur.
aşağıdaki Azure portalveritabanı hesabınız içinde bir tablo oluşturmak için Cosmos tamamlayın.
3 - Veritabanı Cosmos dizesini alma
Cosmos DB'de tablolarınızı erişmek için uygulamanıza CosmosDB veritabanı hesabı için tablo bağlantı dizesi Depolama gerekir. Bağlantı dizesi Azure portal, Azure CLI veya Azure PowerShell.
Cosmos DB hesabınız için bağlantı dizesi bir uygulama gizli dizisi olarak kabul edilir ve diğer uygulama gizli dizileri veya parolalar gibi korunmalıdır. Bu örnek, geliştirme sırasında bağlantı dizesini depolamak ve uygulamanın kullanımına hazır hale etmek için Gizli Dizi Yöneticisi aracını kullanır. Gizli Bilgi Yöneticisi aracına Visual Studio .NET CLI'dan erişilebilir.
Gizli Dizi Yöneticisi aracını Visual Studio için projeye sağ tıklayın ve bağlam menüsünden Kullanıcı Gizli Dizilerini Yönet'i seçin. Bu, projenin secrets.json dosyasını açar. Dosyanın içeriğini aşağıdaki JSON ile değiştirin ve yerine Cosmos DB tablo bağlantı dizenizi girin.
{
"ConnectionStrings": {
"CosmosTableApi": "<cosmos db table connection string>"
}
}
4 - Azure.Data.Tables NuGet yükleme
.NET uygulamasından Cosmos DB Tablo API'si erişmek için Azure.Data.Tables NuGet yükleyin.
Install-Package Azure.Data.Tables
5 - Startup.cs'de Tablo istemcisini yapılandırma
Azure SDK, Azure'da farklı işlemler yürütmek için istemci nesnelerini kullanarak Azure ile iletişim kurar. TableClient nesnesi, Cosmos DB veritabanı sunucusuyla iletişim Tablo API'si.
Bir uygulama genellikle uygulama genelinde kullanılacak tablo başına tek bir TableClient nesnesi oluşturur. Bunu gerçekleştirmek için bağımlılık ekleme (DI) kullanılması ve TableClient nesnesini tekli olarak kaydetmeniz önerilir. Azure SDK ile DI kullanma hakkında daha fazla bilgi için bkz. .NET için Azure SDK ile bağımlılık ekleme.
Uygulamanın Startup.cs dosyasında ConfigureServices() yöntemini aşağıdaki kod parçacığıyla eş olacak şekilde düzenleyin:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddMvcOptions(options =>
{
options.Filters.Add(new ValidationFilter());
});
var connectionString = Configuration.GetConnectionString("CosmosTableApi");
services.AddSingleton<TableClient>(new TableClient(connectionString, "WeatherData"));
services.AddSingleton<TablesService>();
}
Startup.cs dosyasının en üstüne aşağıdaki using deyimini de eklemeniz gerekir.
using Azure.Data.Tables;
6 - Veritabanı Cosmos işlemlerini uygulama
Örnek Cosmos veritabanı tablo işlemlerinin hepsi Hizmetler TableService dizininde bulunan sınıfında uygulanır. SDK paketinde Azure nesnelerle çalışmak için bu dosyanın üst kısmında ve ad alanlarını Azure.Data.Tables içeri Azure.Data.Tables aktarmanız gerekir.
using Azure;
using Azure.Data.Tables;
Sınıfının başında, TableClient nesnesi için bir üye değişkeni ve TableService TableClient nesnesinin sınıfa eklensin izin vermek için bir oluşturucu ekleyin.
private TableClient _tableClient;
public TablesService(TableClient tableClient)
{
_tableClient = tableClient;
}
Tablodan satırlar alır
TableClient sınıfı, tablodaki satırları seçmenize olanak sağlayan Query adlı bir yöntem içerir. Bu örnekte, yöntemine parametre geçirilene kadar tablodan tüm satırlar seçilir.
yöntemi ayrıca, model sınıfı verilerini belirten ITableEntity türünde genel bir parametre olarak döndürülür. Bu durumda, TableEntity yerleşik sınıfı kullanılır; başka bir anlama Query gelir, yöntemin sonuçları olarak Pageable<TableEntity> bir koleksiyon geri döneceği anlamına gelir.
public IEnumerable<WeatherDataModel> GetAllRows()
{
Pageable<TableEntity> entities = _tableClient.Query<TableEntity>();
return entities.Select(e => MapTableEntityToWeatherDataModel(e));
}
Pakette tanımlanan TableEntity Azure.Data.Tables sınıfı, tablodaki bölüm anahtarı ve satır anahtarı değerleri için özelliklere sahiptir. Birlikte, tablodaki satır için benzersiz bir anahtar için bu iki değer. Bu örnek uygulamada, hava durumu istasyonunun (şehir) adı bölüm anahtarında, gözlemin tarihi/saati ise satır anahtarında depolanır. Diğer tüm özellikler (sıcaklık, nem, rüzgar hızı) nesnesinde bir sözlükte TableEntity depolanır.
TableEntity nesnesini kendi tanımınıza ait bir nesneyle eşlemek yaygın bir uygulamadır. Örnek uygulama bu amaç için WeatherDataModel Models dizininde bir sınıf tanımlar. Bu sınıf, bölüm anahtarının ve satır anahtarının eşleyecek istasyon adı ve gözlem tarihi özelliklerine sahiptir ve bu değerler için daha anlamlı özellik adları sağlar. Ardından nesnede diğer tüm özellikleri depolamak için bir sözlük kullanır. Bir satırda herhangi bir sayıda rastgele özellik olması ve model nesnelerimizin bunların hepsini yakalaması mümkün olduğu için Tablo depolama ile çalışırken bu yaygın bir desendir. Bu sınıf ayrıca sınıfındaki özellikleri listeleye yöntemler içerir.
public class WeatherDataModel
{
// Captures all of the weather data properties -- temp, humidity, wind speed, etc
private Dictionary<string, object> _properties = new Dictionary<string, object>();
public string StationName { get; set; }
public string ObservationDate { get; set; }
public DateTimeOffset? Timestamp { get; set; }
public string Etag { get; set; }
public object this[string name]
{
get => ( ContainsProperty(name)) ? _properties[name] : null;
set => _properties[name] = value;
}
public ICollection<string> PropertyNames => _properties.Keys;
public int PropertyCount => _properties.Count;
public bool ContainsProperty(string name) => _properties.ContainsKey(name);
}
yöntemi MapTableEntityToWeatherDataModel bir TableEntity nesnesini bir nesnesiyle eşlemek için WeatherDataModel kullanılır. TableEntity nesnesi, nesnenin tablosunda yer alan tüm özellik adlarını (aslında tablodaki bu satırın sütun adlarını) almak için bir Keys özelliği içerir. yöntemi, , , ve özelliklerini doğrudan eşler ve ardından nesnesinde diğer özellikler üzerinde yinelenen özelliğini kullanır ve doğrudan eşlenmiş olan özelliklerden eksi olarak bu özellikleri nesnesiyle MapTableEntityToWeatherDataModel PartitionKey RowKey Timestamp Etag Keys TableEntity WeatherDataModel eşler.
yönteminde kodu aşağıdaki MapTableEntityToWeatherDataModel kod bloğuyla eş olacak şekilde düzenleyin.
public WeatherDataModel MapTableEntityToWeatherDataModel(TableEntity entity)
{
WeatherDataModel observation = new WeatherDataModel();
observation.StationName = entity.PartitionKey;
observation.ObservationDate = entity.RowKey;
observation.Timestamp = entity.Timestamp;
observation.Etag = entity.ETag.ToString();
var measurements = entity.Keys.Where(key => !EXCLUDE_TABLE_ENTITY_KEYS.Contains(key));
foreach (var key in measurements)
{
observation[key] = entity[key];
}
return observation;
}
Tablodan döndürülen satırları filtreleme
Bir tablodan döndürülen satırları filtrelemek için Query yöntemine bir OData stili filtre dizesi geçebilirsiniz. Örneğin 1 Temmuz 2021 gece yarısı ile 2 Temmuz 2021 gece yarısı (dahil) arasında Chicago için tüm hava durumu okumalarını almak için aşağıdaki filtre dizesini geçersiniz.
PartitionKey eq 'Chicago' and RowKey ge '2021-07-01 12:00 AM' and RowKey le '2021-07-02 12:00 AM'
Sistem Sorgu seçeneğini filtrele bölümünde OData web sitesinde tüm OData filtre işleçlerini görüntüebilirsiniz.
Örnek uygulamada nesnesi, FilterResultsInputModel kullanıcı tarafından sağlanan tüm filtre ölçütlerini yakalamak için tasarlanmıştır.
public class FilterResultsInputModel : IValidatableObject
{
public string PartitionKey { get; set; }
public string RowKeyDateStart { get; set; }
public string RowKeyTimeStart { get; set; }
public string RowKeyDateEnd { get; set; }
public string RowKeyTimeEnd { get; set; }
[Range(-100, +200)]
public double? MinTemperature { get; set; }
[Range(-100,200)]
public double? MaxTemperature { get; set; }
[Range(0, 300)]
public double? MinPrecipitation { get; set; }
[Range(0,300)]
public double? MaxPrecipitation { get; set; }
}
Bu nesne sınıfındaki yöntemine geçir olduğunda, her null olmayan özellik GetFilteredRows değeri için bir filtre dizesi TableService oluşturur. Ardından tüm değerleri bir "and" yan tümcesi ile birleştirerek birleştirilmiş bir filtre dizesi oluşturur. Bu birleşik filtre dizesi TableClient nesnesinde Query yöntemine geçir edilir ve yalnızca filtre dizesiyle eşleşen satırlar döndürülür. Uygulamanıza gereken uygun filtre dizelerini oluşturmak için kodunda benzer bir yöntem kullanabilirsiniz.
public IEnumerable<WeatherDataModel> GetFilteredRows(FilterResultsInputModel inputModel)
{
List<string> filters = new List<string>();
if (!String.IsNullOrEmpty(inputModel.PartitionKey))
filters.Add($"PartitionKey eq '{inputModel.PartitionKey}'");
if (!String.IsNullOrEmpty(inputModel.RowKeyDateStart) && !String.IsNullOrEmpty(inputModel.RowKeyTimeStart))
filters.Add($"RowKey ge '{inputModel.RowKeyDateStart} {inputModel.RowKeyTimeStart}'");
if (!String.IsNullOrEmpty(inputModel.RowKeyDateEnd) && !String.IsNullOrEmpty(inputModel.RowKeyTimeEnd))
filters.Add($"RowKey le '{inputModel.RowKeyDateEnd} {inputModel.RowKeyTimeEnd}'");
if (inputModel.MinTemperature.HasValue)
filters.Add($"Temperature ge {inputModel.MinTemperature.Value}");
if (inputModel.MaxTemperature.HasValue)
filters.Add($"Temperature le {inputModel.MaxTemperature.Value}");
if (inputModel.MinPrecipitation.HasValue)
filters.Add($"Precipitation ge {inputModel.MinTemperature.Value}");
if (inputModel.MaxPrecipitation.HasValue)
filters.Add($"Precipitation le {inputModel.MaxTemperature.Value}");
string filter = String.Join(" and ", filters);
Pageable<TableEntity> entities = _tableClient.Query<TableEntity>(filter);
return entities.Select(e => MapTableEntityToWeatherDataModel(e));
}
TableEntity nesnesi kullanarak veri ekleme
Tabloya veri eklemenin en basit yolu TableEntity nesnesi kullanmaktır. Bu örnekte, veriler bir giriş modeli nesnesinden TableEntity nesnesine eşlenmiş. Hava durumu istasyonu adını ve gözlem tarihini/saati temsil eden giriş nesnesi özellikleri sırasıyla PartitionKey ve RowKey özelliklerine eşlenmiş ve bu özellikler tablodaki satır için benzersiz bir anahtar oluşturur. Ardından, giriş modeli nesnesine ek özellikler TableEntity nesnede sözlük özellikleriyle eşlenmiş olur. Son olarak TableClient nesne üzerinde AddEntity yöntemi tabloya veri eklemek için kullanılır.
Örnek InsertTableEntity uygulamanın sınıfını aşağıdaki kodu içermesi için değiştirme.
public void InsertTableEntity(WeatherInputModel model)
{
TableEntity entity = new TableEntity();
entity.PartitionKey = model.StationName;
entity.RowKey = $"{model.ObservationDate} {model.ObservationTime}";
// The other values are added like a items to a dictionary
entity["Temperature"] = model.Temperature;
entity["Humidity"] = model.Humidity;
entity["Barometer"] = model.Barometer;
entity["WindDirection"] = model.WindDirection;
entity["WindSpeed"] = model.WindSpeed;
entity["Precipitation"] = model.Precipitation;
_tableClient.AddEntity(entity);
}
TableEntity nesnesi kullanarak verileri upsert
Bu tabloda zaten mevcut olan bölüm anahtarı/satır anahtarı bileşimine sahip bir tabloya satır eklemeye çalışsanız bir hata alırsınız. Bu nedenle, tabloya satır eklerken Genellikle AddEntity yöntemi yerine UpsertEntity kullanmak tercih edilir. Verilen bölüm anahtarı/satır anahtarı bileşimi tabloda zaten varsa, UpsertEntity yöntemi mevcut satırı güncelleştirir. Aksi takdirde satır tabloya eklenir.
public void UpsertTableEntity(WeatherInputModel model)
{
TableEntity entity = new TableEntity();
entity.PartitionKey = model.StationName;
entity.RowKey = $"{model.ObservationDate} {model.ObservationTime}";
// The other values are added like a items to a dictionary
entity["Temperature"] = model.Temperature;
entity["Humidity"] = model.Humidity;
entity["Barometer"] = model.Barometer;
entity["WindDirection"] = model.WindDirection;
entity["WindSpeed"] = model.WindSpeed;
entity["Precipitation"] = model.Precipitation;
_tableClient.UpsertEntity(entity);
}
Değişken özellikleriyle veri ekleme veya upsert
Cosmos DB Tablo API'si kullanmanın avantajlarından biri, bir tabloya yüklenen bir nesnenin yeni özellikler içerdiğinde bu özelliklerin tabloya otomatik olarak ekleniyor olması ve Cosmos DB'de depolanan değerlerin olmasıdır. Geleneksel veritabanında olduğu gibi sütunlar eklemek için ALTER TABLE gibi DDL deyimleri çalıştırmanıza gerek yoktur.
Bu model, zaman içinde hangi verilerin yakalanması gerektiğini ek olarak değiştirerek veri kaynaklarıyla ilgilenmek veya farklı girişler uygulamanıza farklı veriler sağlamaktayken uygulamanıza esneklik sağlar. Örnek uygulamada yalnızca temel hava durumu verilerini değil bazı ek değerleri de gönderen bir hava durumu istasyonunun benzetimini de tamamlarız. Bu yeni özelliklere sahip bir nesne tabloda ilk kez depolandığı zaman, karşılık gelen özellikler (sütunlar) tabloya otomatik olarak eklenir.
Örnek uygulamada sınıfı, ExpandableWeatherObject nesnesinde herhangi bir özellik kümesi desteklemek için bir iç sözlük etrafında yerleşiktir. Bu sınıf, bir nesnenin rastgele bir özellik kümesi içermesi gereken tipik bir deseni temsil eder.
public class ExpandableWeatherObject
{
public Dictionary<string, object> _properties = new Dictionary<string, object>();
public string StationName { get; set; }
public string ObservationDate { get; set; }
public object this[string name]
{
get => (ContainsProperty(name)) ? _properties[name] : null;
set => _properties[name] = value;
}
public ICollection<string> PropertyNames => _properties.Keys;
public int PropertyCount => _properties.Count;
public bool ContainsProperty(string name) => _properties.ContainsKey(name);
}
Tablo API'si kullanarak böyle bir nesne eklemek veya upsert etmek için, genişletilebilir nesnenin özelliklerini bir TableEntity nesnesine eşler ve TableClient nesnesinde AddEntity veya UpsertEntity yöntemlerini uygun şekilde kullanın.
public void InsertExpandableData(ExpandableWeatherObject weatherObject)
{
TableEntity entity = new TableEntity();
entity.PartitionKey = weatherObject.StationName;
entity.RowKey = weatherObject.ObservationDate;
foreach (string propertyName in weatherObject.PropertyNames)
{
var value = weatherObject[propertyName];
entity[propertyName] = value;
}
_tableClient.AddEntity(entity);
}
public void UpsertExpandableData(ExpandableWeatherObject weatherObject)
{
TableEntity entity = new TableEntity();
entity.PartitionKey = weatherObject.StationName;
entity.RowKey = weatherObject.ObservationDate;
foreach (string propertyName in weatherObject.PropertyNames)
{
var value = weatherObject[propertyName];
entity[propertyName] = value;
}
_tableClient.UpsertEntity(entity);
}
Varlığı güncelleştirme
Varlıklar, TableClient nesne üzerinde UpdateEntity yöntemi çağrılarak güncelleştirilebilir. Tablo API'si kullanılarak depolanan bir varlık (satır) rastgele bir özellik kümesi içereyene kadar, daha önce ele alınana benzer bir Sözlük nesnesine dayalı bir güncelleştirme nesnesi oluşturmak ExpandableWeatherObject genellikle yararlıdır. Bu durumda tek fark, güncelleştirmeler sırasında eşzamanlılık Etag denetimi için kullanılan bir özelliğin ekseriyetini ifade eder.
public class UpdateWeatherObject
{
public Dictionary<string, object> _properties = new Dictionary<string, object>();
public string StationName { get; set; }
public string ObservationDate { get; set; }
public string Etag { get; set; }
public object this[string name]
{
get => (ContainsProperty(name)) ? _properties[name] : null;
set => _properties[name] = value;
}
public ICollection<string> PropertyNames => _properties.Keys;
public int PropertyCount => _properties.Count;
public bool ContainsProperty(string name) => _properties.ContainsKey(name);
}
Örnek uygulamada, bu nesne sınıfındaki UpdateEntity yöntemine TableService geçirildi. Bu yöntem ilk olarak TableClient üzerinde GetEntity yöntemini Tablo API'si var olan varlığı dosyadan yükler. Ardından bu varlık nesnesini günceller ve UpdateEntity güncelleştirmeleri veritabanına kaydetme yöntemini kullanır. UpdateEntity yönteminin nesnenin başlangıçta yüklendiğinden beri değişmediğinin doğrulanabilecek geçerli Etag'ini nasıl alır? Varlığı ne olursa olsun güncelleştirmek için yöntemine değerini Etag.Any UpdateEntity geçebilirsiniz.
public void UpdateEntity(UpdateWeatherObject weatherObject)
{
string partitionKey = weatherObject.StationName;
string rowKey = weatherObject.ObservationDate;
// Use the partition key and row key to get the entity
TableEntity entity = _tableClient.GetEntity<TableEntity>(partitionKey, rowKey).Value;
foreach (string propertyName in weatherObject.PropertyNames)
{
var value = weatherObject[propertyName];
entity[propertyName] = value;
}
_tableClient.UpdateEntity(entity, new ETag(weatherObject.Etag));
}
Varlığı kaldırma
Bir tablodaki varlığı kaldırmak için TableClient nesnesinde DeleteEntity yöntemini, nesnenin bölüm anahtarı ve satır anahtarıyla çağırabilirsiniz.
public void RemoveEntity(string partitionKey, string rowKey)
{
_tableClient.DeleteEntity(partitionKey, rowKey);
}
7 - Kodu çalıştırma
Cosmos DB veritabanı sunucusuyla etkileşim kurmak için örnek Tablo API'si. Uygulamayı ilk kez çalıştıracak olurken tablo boş olduğundan veri olmayacaktır. Tabloya veri eklemek için uygulamanın üst kısmında yer alan düğmelerden herhangi birini kullanın.
Tablo Varlığı kullanarak ekle düğmesinin seçerek bir nesnesi kullanarak yeni satır ekleme veya upsert oluşturma seçeneklerine sahip bir iletişim kutusu TableEntity açılır.
Genişletilebilir Veri Kullanarak Ekle düğmesinin seçerek özel özelliklere sahip bir nesne eklemenizi sağlayan bir iletişim kutusu açılır ve Cosmos DB Tablo API'si'nin gerektiğinde tabloya özellikleri (sütunları) nasıl otomatik olarak ekley olduğunu gösterir. Bir veya daha fazla yeni özellik eklemek ve bu özelliği göstermek için Özel Alan Ekle düğmesini kullanın.
Cosmos DB Tablonıza bazı örnek verileri yüklemek için Örnek Veri Ekle düğmesini kullanın.
Sonuçları Filtrele sayfasına alınacak üst menüden Sonuçları Filtrele öğesini seçin. Bu sayfada, bir filtre yan tümcesini nasıl yapıltır ve Cosmos DB veritabanına nasıl geçirebilirsiniz göstermek için filtre ölçütlerini Tablo API'si.
Kaynakları temizleme
Örnek uygulamayla bitirdikten sonra bu makaleyle ilgili tüm Azure kaynaklarını Azure hesabınızdan kaldırmanız gerekir. Bunu yapmak için kaynak grubunu silebilirsiniz.
Kaynak grubu, aşağıdaki Azure portal kullanılarak silinebilir.
Sonraki adımlar
Bu hızlı başlangıçta Azure Cosmos DB hesabı oluşturmayı, Veri Gezgini'ni kullanarak tablo oluşturmayı ve bir uygulamayı çalıştırmayı öğrendiniz. Şimdi Tablo API'sini kullanarak verilerinizi sorgulayabilirsiniz.