Dijital ikizleri yönetme

Ortamınızdaki varlıklar dijital ikizler tarafından temsil edilir. Dijital ikizlerinizi yönetmek için oluşturma, değiştirme ve kaldırma işlemleri gerekebilir.

Bu makale dijital ikizleri yönetmeye odaklanır; ilişkiler ve ikiz grafı ile bir bütün olarak çalışmak için bkz. İkiz grafını ve ilişkileri yönetme.

Bahşiş

Tüm SDK işlevleri zaman uyumlu ve zaman uyumsuz sürümlerde gelir.

Önkoşullar

Bu makalede Azure Digital Twins ile çalışmak için bir Azure Digital Twins örneğine ve bunu kullanmak için gerekli izinlere sahip olmanız gerekir. Zaten ayarlanmış bir Azure Digital Twins örneğiniz varsa bu örneği kullanabilir ve sonraki bölüme atlayabilirsiniz. Aksi takdirde, Örnek ve kimlik doğrulaması ayarlama başlığındaki yönergeleri izleyin. Yönergeler, her adımı başarıyla tamamladığınızdan emin olmanıza yardımcı olacak bilgiler içerir.

Örneğinizi ayarladıktan sonra, örneğin ana bilgisayar adını not edin. Konak adını Azure portalında bulabilirsiniz.

Geliştirici arabirimleri

Bu makalede .NET (C#) SDK'sını kullanarak farklı yönetim işlemlerinin nasıl tamamlandığı vurgulanmaktadır. Bu yönetim çağrılarını Azure Digital Twins API'leri ve SDK'larında açıklanan diğer dil SDK'larını kullanarak da oluşturabilirsiniz.

Bu işlemleri tamamlamak için kullanılabilecek diğer geliştirici arabirimleri şunlardır:

Görselleştirme

Azure Digital Twins Gezgini , Azure Digital Twins grafınızdaki verileri keşfetmeye yönelik görsel bir araçtır. Modellerinizi, ikizlerinizi ve ilişkilerinizi görüntülemek, sorgulamak ve düzenlemek için gezgini kullanabilirsiniz.

Azure Digital Twins Gezgini aracı hakkında bilgi edinmek için bkz . Azure Digital Twins Gezgini. Özelliklerini kullanma hakkında ayrıntılı adımlar için bkz . Azure Digital Twins Gezgini'ni kullanma.

Görselleştirme şöyle görünür:

Screenshot of Azure Digital Twins Explorer showing sample models and twins.

Dijital ikiz oluşturma

İkiz oluşturmak için hizmet istemcisinde yöntemini şu şekilde kullanırsınız CreateOrReplaceDigitalTwinAsync() :

await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);

Dijital ikiz oluşturmak için şunları sağlamanız gerekir:

  • Dijital ikize atamak istediğiniz kimlik değeri (ikiz oluşturulduğunda bu kimliği tanımlarsınız)
  • Kullanmak istediğiniz model
  • İkiz verilerinin istenen şekilde başlatılması,...
    • Özellikler (başlatma isteğe bağlı): İsterseniz dijital ikizin özellikleri için başlangıç değerlerini ayarlayabilirsiniz. Özellikler isteğe bağlı olarak değerlendirilir ve daha sonra ayarlanabilir, ancak ayarlanana kadar ikizin bir parçası olarak gösterilmeyeceklerini unutmayın.
    • Bileşenler (bir ikizde varsa başlatma gerekir): İkiziniz herhangi bir bileşen içeriyorsa, bunlar ikiz oluşturulduğunda başlatılmalıdır. Bunlar boş nesneler olabilir, ancak bileşenlerin kendilerinin var olması gerekir.

Model ve ilk özellik değerleri, ilgili verileri içeren bir JSON dizesi olan parametresi aracılığıyla initData sağlanır. Bu nesneyi yapılandırma hakkında daha fazla bilgi için sonraki bölüme geçin.

Bahşiş

İkizi oluşturduktan veya güncelleştirdikten sonra değişikliklerin sorgulara yansıtılması için 10 saniyeye kadar gecikme süresi olabilir. GetDigitalTwin API (bu makalenin devamında açıklanmıştır) bu gecikmeyi yaşamaz, bu nedenle anlık yanıt gerekiyorsa, yeni oluşturulan ikizlerinizi görmek için sorgulamak yerine API çağrısını kullanın.

Modeli ve özellikleri başlatma

İkiz oluşturulduğu sırada ikizin özelliklerini başlatabilirsiniz.

İkiz oluşturma API'si, ikiz özelliklerinin geçerli bir JSON açıklamasına seri hale getirilmiş bir nesneyi kabul eder. İkiz için JSON biçiminin açıklaması için bkz . Dijital ikizler ve ikiz grafiği .

İlk olarak, ikizini ve özellik verilerini temsil eden bir veri nesnesi oluşturabilirsiniz. Parametre nesnesini el ile veya sağlanan bir yardımcı sınıfı kullanarak oluşturabilirsiniz. Aşağıda her birinin bir örneği verilmiştir.

El ile oluşturulan verileri kullanarak ikiz oluşturma

Herhangi bir özel yardımcı sınıf kullanılmadan, bir ikizin özelliklerini Dictionary<string, object>içinde temsil edebilirsiniz; burada string özelliğin adı ve object özelliği ve değerini temsil eden bir nesnedir.

// Define a custom model type for the twin to be created

internal class CustomDigitalTwin
{
    [JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinId)]
    public string Id { get; set; }

    [JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinETag)]
    public string ETag { get; set; }

    [JsonPropertyName("temperature")]
    public double Temperature { get; set; }

    [JsonPropertyName("humidity")]
    public double Humidity{ get; set; }
}

// Initialize properties and create the twin
public class TwinOperationsCreateTwin
{
    public async Task CreateTwinAsync(DigitalTwinsClient client)
    {
        // Initialize the twin properties
        var myTwin = new CustomDigitalTwin
        {
            Temperature = 25.0,
            Humidity = 50.0,
        };

        // Create the twin
        const string twinId = "<twin-ID>";
        Response<CustomDigitalTwin> response = await client.CreateOrReplaceDigitalTwinAsync(twinId, myTwin);
        Console.WriteLine($"Temperature value: {response.Value.Temperature}");
    }
}

Yardımcı sınıfıyla ikiz oluşturma

yardımcı sınıfı BasicDigitalTwin , özellik alanlarını doğrudan bir "ikiz" nesnesinde depolamanıza olanak tanır. Daha sonra ikiz nesnesine CustomProperties doğrudan olarak eklenebilen bir Dictionary<string, object>kullanarak özelliklerin listesini oluşturmak isteyebilirsiniz.

string twinId = "myTwinID";
var initData = new BasicDigitalTwin
{
    Id = twinId,
    Metadata = { ModelId = "dtmi:example:Room;1" },
    // Initialize properties
    Contents =
    {
        { "Temperature", 25.0 },
        { "Humidity", 50.0 },
    },
};

await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);

Dekont

BasicDigitalTwin nesneleri bir Id alanla birlikte gelir. Bu alanı boş bırakabilirsiniz, ancak bir kimlik değeri eklerseniz, çağrıya geçirilen kimlik parametresiyle eşleşmesi CreateOrReplaceDigitalTwinAsync() gerekir. Örneğin:

twin.Id = "myRoomId";

İşleri İçeri Aktar API'siyle toplu olarak ikiz oluşturma

tek bir API çağrısında aynı anda çok sayıda ikiz oluşturmak için İşleri İçeri Aktar API'sini kullanabilirsiniz. Bu yöntem, ikizler ve toplu işler için Azure Digital Twins örneğinizde Azure Blob Depolama ve yazma izinlerinin kullanılmasını gerektirir.

Bahşiş

İşleri İçeri Aktarma API'si, bir grafiğin tüm bölümlerini aynı anda oluşturmak için modellerin ve ilişkilerin aynı çağrıda içeri aktarılmasına da olanak tanır. Bu işlem hakkında daha fazla bilgi için bkz . İçeri Aktarma İşleri API'siyle modelleri, ikizleri ve ilişkileri toplu olarak karşıya yükleme.

İkizleri toplu olarak içeri aktarmak için, ikizlerinizi (ve toplu içeri aktarma işine dahil edilen diğer kaynakları) NDJSON dosyası olarak yapılandırmanız gerekir. bölümü Twins , bölümünden Models sonra (ve bölümünden Relationships önce) gelir. Dosyada tanımlanan ikizler, bu dosyada tanımlanan veya örnekte zaten mevcut olan modellere başvurabilir ve isteğe bağlı olarak ikizin özelliklerinin başlatılmasını içerebilir.

İçeri Aktarma İşleri API'sine giriş bölümünde örnek bir içeri aktarma dosyası ve bu dosyaları oluşturmak için örnek bir proje görüntüleyebilirsiniz.

Ardından, dosyanın Azure Blob Depolama'daki bir ekleme blobuna yüklenmesi gerekir. Azure depolama kapsayıcısı oluşturma yönergeleri için bkz . Kapsayıcı oluşturma. Ardından, tercih ettiğiniz karşıya yükleme yöntemini kullanarak dosyayı karşıya yükleyin (bazı seçenekler AzCopy komutu, Azure CLI veya Azure portalıdır).

NDJSON dosyası kapsayıcıya yüklendikten sonra url'sini blob kapsayıcısına alın. Bu değeri daha sonra toplu içeri aktarma API çağrısının gövdesinde kullanacaksınız.

Azure portalında blob dosyasının URL değerini gösteren ekran görüntüsü aşağıdadır:

Screenshot of the Azure portal showing the URL of a file in a storage container.

Ardından, dosya bir İçeri Aktarma İşleri API çağrısında kullanılabilir. Giriş dosyasının blob depolama URL'sini ve hizmet tarafından oluşturulan çıktı günlüğünün nerede depolanmasını istediğinizi belirtmek için yeni bir blob depolama URL'si sağlarsınız.

Dijital ikiz için veri alma

Aşağıdaki gibi bir yöntemi çağırarak herhangi bir dijital ikizin ayrıntılarına GetDigitalTwin() erişebilirsiniz:

Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
twin = twinResponse.Value;

Bu çağrı, ikiz verilerini gibi kesin olarak belirlenmiş bir nesne türü olarak BasicDigitalTwindöndürür. BasicDigitalTwin , sdk ile birlikte gelen ve çekirdek ikiz meta verilerini ve özelliklerini hazırlanan biçimde döndüren bir serileştirme yardımcı sınıfıdır. veya Newtonsoft.Jsongibi System.Text.Json tercih ettiğiniz JSON kitaplığını kullanarak ikiz verilerini istediğiniz zaman seri durumdan çıkarabilirsiniz. Ancak, bir ikize temel erişim için yardımcı sınıflar bunu daha kullanışlı hale getirebilirsiniz.

Dekont

BasicDigitalTwin öznitelikleri kullanır System.Text.Json . DigitalTwinsClient ile kullanmak BasicDigitalTwin için istemciyi varsayılan oluşturucuyla başlatmanız veya seri hale getirici seçeneğini özelleştirmek istiyorsanız JsonObjectSerializer'ı kullanmanız gerekir.

BasicDigitalTwin Yardımcı sınıfı, bir Dictionary<string, object>aracılığıyla ikizde tanımlanan özelliklere de erişmenizi sağlar. İkizin özelliklerini listelemek için şunları kullanabilirsiniz:

BasicDigitalTwin twin;
Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
twin = twinResponse.Value;
Console.WriteLine($"Model id: {twin.Metadata.ModelId}");
foreach (string prop in twin.Contents.Keys)
{
    if (twin.Contents.TryGetValue(prop, out object value))
        Console.WriteLine($"Property '{prop}': {value}");
}

Yöntemiyle GetDigitalTwin() bir ikiz aldığınızda yalnızca en az bir kez ayarlanmış özellikler döndürülür.

Bahşiş

displayName bir ikiz için, model meta verilerinin bir parçasıdır, bu nedenle ikiz örneği için veri alırken gösterilmez. Bu değeri görmek için modelden alabilirsiniz.

Tek bir API çağrısı kullanarak birden çok ikiz almak için İkiz grafını sorgulama'daki Sorgu API'si örneklerine bakın.

Ay'ı tanımlayan aşağıdaki modeli (Digital Twins Tanım Dili (DTDL) ile yazılmış) göz önünde bulundurun:

{
    "@id": "dtmi:example:Moon;1",
    "@type": "Interface",
    "@context": "dtmi:dtdl:context;3",
    "contents": [
        {
            "@type": "Property",
            "name": "radius",
            "schema": "double",
            "writable": true
        },
        {
            "@type": "Property",
            "name": "mass",
            "schema": "double",
            "writable": true
        }
    ]
}

Ay türündeki bir ikizde çağrının object result = await client.GetDigitalTwinAsync("my-moon"); sonucu şu şekilde görünebilir:

{
  "$dtId": "myMoon-001",
  "$etag": "W/\"e59ce8f5-03c0-4356-aea9-249ecbdc07f9\"",
  "radius": 1737.1,
  "mass": 0.0734,
  "$metadata": {
    "$model": "dtmi:example:Moon;1",
    "radius": {
      "lastUpdateTime": "2022-12-06T20:00:32.8209188Z"
    },
    "mass": {
      "lastUpdateTime": "2022-12-04T12:04:43.3859361Z"
    }
  }
}

Dijital ikizin tanımlı özellikleri, dijital ikizde üst düzey özellikler olarak döndürülür. DTDL tanımının parçası olmayan meta veriler veya sistem bilgileri bir $ ön ek ile döndürülür. Meta veri özellikleri aşağıdaki değerleri içerir:

  • $dtId: Bu Azure Digital Twins örneğindeki dijital ikizin kimliği
  • $etag: Web sunucusu tarafından atanan standart bir HTTP alanı. Bu, ikiz her güncelleştirildiğinde yeni bir değere güncelleştirilir ve bu da ikizin verilerinin önceki bir denetimden bu yana sunucuda güncelleştirilip güncelleştirilmediğini belirlemek için yararlı olabilir. Yalnızca varlığın etag'i sağlanan etag ile eşleşiyorsa tamamlanan güncelleştirmeleri ve silmeleri gerçekleştirmek için kullanabilirsiniz If-Match . Bu işlemler hakkında daha fazla bilgi için DigitalTwins Update ve DigitalTwins Delete belgelerine bakın.
  • $metadata: Aşağıdakileri içerebilen bir dizi meta veri özelliği:
    • $model, dijital ikizin modelinin DTMI'sı.
    • lastUpdateTime ikiz özellikleri için. Bu, Azure Digital Twins'in özellik güncelleştirme iletisini işlediği tarihi ve saati gösteren bir zaman damgasıdır
    • sourceTime ikiz özellikleri için. Bu, özellik güncelleştirmesinin gerçek dünyada gözlemlendiği zaman damgasını temsil eden isteğe bağlı, yazılabilir bir özelliktir.

Dijital ikiz JSON biçiminde bir dijital ikizde bulunan alanlar hakkında daha fazla bilgi edinebilirsiniz. Azure Digital Twins API'leri ve SDK'ları gibi BasicDigitalTwin serileştirme yardımcı sınıfları hakkında daha fazla bilgi edinebilirsiniz.

Tüm dijital ikizleri görüntüle

Örneğinizdeki tüm dijital ikizleri görüntülemek için bir sorgu kullanın. Sorgu API'leri veya CLI komutları ile bir sorgu çalıştırabilirsiniz.

Örnekteki tüm dijital ikizlerin listesini döndüren temel sorgunun gövdesi aşağıdadır:

SELECT * FROM DIGITALTWINS

Dijital ikiz güncelleştirme

Dijital ikizin özelliklerini güncelleştirmek için, değiştirmek istediğiniz bilgileri JSON Patch biçiminde yazın. ve dahil olmak üzere replaceaddremovekullanılabilecek JSON Düzeltme Eki işlemlerinin tam listesi için bkz. JSON Düzeltme Eki İşlemleri.

Güncelleştirme bilgilerini içeren JSON Patch belgesini ürettikten sonra, belgeyi yöntemine UpdateDigitalTwin() geçirin:

await client.UpdateDigitalTwinAsync(twinId, updateTwinData);

Tek bir düzeltme eki çağrısı, tek bir ikizde istediğiniz kadar özelliği güncelleştirebilir (tümü bile). Birden çok ikiz arasında özellikleri güncelleştirmeniz gerekiyorsa, her ikiz için ayrı bir güncelleştirme çağrısına ihtiyacınız vardır.

Bahşiş

İkizi oluşturduktan veya güncelleştirdikten sonra değişikliklerin sorgulara yansıtılması için 10 saniyeye kadar gecikme süresi olabilir. GetDigitalTwin API (bu makalenin önceki bölümlerinde açıklanan) bu gecikmeyle karşılaşmaz, bu nedenle anlık yanıta ihtiyacınız varsa yeni güncelleştirilen ikizlerinizi görmek için sorgulama yerine API çağrısını kullanın.

JSON Patch kodu örneği aşağıda verilmiştır. Bu belge, uygulandığı dijital ikizin kütle ve yarıçap özellik değerlerinin yerini alır. Bu örnekte, mevcut bir özelliğin değerinin yerini alan JSON Patch replace işlemi gösterilir.

[
    {
      "op": "replace",
      "path": "/mass",
      "value": 0.0799
    },
    {
      "op": "replace",
      "path": "/radius",
      "value": 0.800
    }
  ]

.NET SDK'sını kullanarak bir kod projesinden ikiz güncelleştirirken, Azure .NET SDK'sının JsonPatchDocument'ını kullanarak JSON düzeltme ekleri oluşturabilirsiniz. JSON Düzeltme Eki belgesi oluşturma ve proje kodunda kullanma UpdateDigitalTwin() örneği aşağıda verilmiştır.

var updateTwinData = new JsonPatchDocument();
updateTwinData.AppendAdd("/Temperature", 25.0);
updateTwinData.AppendAdd("/myComponent/Property", "Hello");
// Un-set a property
updateTwinData.AppendRemove("/Humidity");

await client.UpdateDigitalTwinAsync("myTwin", updateTwinData).ConfigureAwait(false);

Bahşiş

Alanı bu bölümde açıklanan işlemle güncelleştirerek $metadata.<property-name>.sourceTime dijital ikizlerinizde kaynak zaman damgalarını koruyabilirsiniz. Bu alan ve dijital ikizler üzerine yazılabilen diğer alanlar hakkında daha fazla bilgi için bkz . Dijital ikiz JSON biçimi.

Dijital ikiz bileşenlerindeki alt özellikleri güncelleştirme

Bir modelin bileşenler içerebileceğini ve bu sayede diğer modellerden oluşturulabileceğini hatırlayın.

Dijital ikizin bileşenlerindeki özelliklere yama uygulamak için JSON Düzeltme Eki'nde yol söz dizimini kullanabilirsiniz:

[
  {
    "op": "replace",
    "path": "/mycomponentname/mass",
    "value": 0.0799
  }
]

Nesne türü özelliklerindeki alt özellikleri güncelleştirme

Modeller bir nesne türünde özellikler içerebilir. Bu nesnelerin kendi özellikleri olabilir ve nesne türü özelliğine ait bu alt özelliklerden birini güncelleştirmek isteyebilirsiniz. Bu işlem, bileşenlerdeki alt özellikleri güncelleştirme işlemine benzer, ancak bazı ek adımlar gerektirebilir.

nesne türü özelliğine sahip bir model düşünün: ObjectProperty. ObjectProperty adlı StringSubPropertybir dize özelliğine sahiptir.

Bu model kullanılarak bir ikiz oluşturulduğunda, o zaman örneği ObjectProperty oluşturmak gerekmez. İkiz oluşturma sırasında nesne özelliği örneği oluşturulmazsa, erişmek ObjectProperty için varsayılan yol oluşturulmaz ve bir düzeltme eki işlemi için bu yol oluşturulmaz StringSubProperty . Özelliklerini güncelleştirebilmek için ObjectProperty önce yolu kendinize eklemeniz gerekir.

Bu, aşağıdaki gibi bir JSON Patch add işlemiyle yapılabilir:

[
  {
    "op": "add", 
    "path": "/ObjectProperty", 
    "value": {"StringSubProperty":"<string-value>"}
  }
]

Dekont

Birden fazla özelliği varsa ObjectProperty , yalnızca birini güncelleştiriyor olsanız bile bunların tümünü value bu işlemin alanına eklemeniz gerekir:

... "value": {"StringSubProperty":"<string-value>", "Property2":"<property2-value>", ...}

Bu bir kez yapıldıktan sonra bir yolu StringSubProperty vardır ve bundan sonra doğrudan tipik replace bir işlemle güncelleştirilebilir:

[
  {
    "op": "replace",
    "path": "/ObjectProperty/StringSubProperty",
    "value": "<string-value>"
  }
]

İkiz oluşturulduğunda örneği oluşturulan durumlarda ObjectProperty ilk adım gerekli olmasa da, nesne özelliğinin ilk kez oluşturulup oluşturulmadığını her zaman kesin olarak bilmediğiniz için, bir alt özelliği ilk kez güncelleştirdiğinizde bunu kullanmanız önerilir.

Dijital ikizin modelini güncelleştirme

İşlev, UpdateDigitalTwin() dijital ikizleri farklı bir modele geçirmek için de kullanılabilir.

Örneğin, dijital ikizin meta veri $model alanının yerini alan aşağıdaki JSON Patch belgesini göz önünde bulundurun:

[
  {
    "op": "replace",
    "path": "/$metadata/$model",
    "value": "dtmi:example:foo;1"
  }
]

Bu işlem yalnızca düzeltme eki tarafından değiştirilen dijital ikiz yeni modele uygunsa başarılı olur.

Aşağıdaki örneği inceleyin:

  1. foo_old modeline sahip bir dijital ikiz düşünün. foo_old gerekli bir özellik kütlesi tanımlar.
  2. Yeni model foo_new bir özellik kütlesi tanımlar ve yeni bir gerekli özellik sıcaklığı ekler.
  3. Yamadan sonra dijital ikizin hem kütle hem de sıcaklık özelliği olmalıdır.

Bu durum için düzeltme ekinin hem modeli hem de ikizin sıcaklık özelliğini şu şekilde güncelleştirmesi gerekir:

[
  {
    "op": "replace",
    "path": "/$metadata/$model",
    "value": "dtmi:example:foo_new;1"
  },
  {
    "op": "add",
    "path": "/temperature",
    "value": 60
  }
]

Özelliğin sourceTime değerini güncelleştirme

İsteğe bağlı olarak, gerçek dünyada özellik güncelleştirmelerinin sourceTime ne zaman gözlemlendiğine ilişkin zaman damgalarını kaydetmek için ikizi özelliklerindeki alanını kullanmaya karar vekleyebilirsiniz. Azure Digital Twins her ikiz özelliği için meta verilerde yerel olarak destekler sourceTime . Değerin sourceTime ISO 8601 tarih ve saat biçimine uygun olması gerekir. Bu alan ve dijital ikizler hakkındaki diğer alanlar hakkında daha fazla bilgi için bkz . Dijital ikiz JSON biçimi.

Bu alanı desteklemek için en düşük kararlı REST API sürümü 2022-05-31 sürümüdür. Azure Digital Twins SDK'larını kullanarak bu alanla çalışmak için, bu alanın dahil olduğundan emin olmak için SDK'nın en son sürümünü kullanmanızı öneririz.

Bir özelliğin hem değerini sourceTime hem de alanını güncelleştiren bir JSON Patch belgesi örneği aşağıda verilmiştir Temperature :

[
  {
    "op": "replace",
    "path": "/Temperature",
    "value": "22.3"
  },
  {
    "op": "replace",
    "path": "/$metadata/Temperature/sourceTime",
    "value": "2021-11-30T18:47:53.7648958Z"
  }
]

Bir bileşenin sourceTime parçası olan bir özellikte alanı güncelleştirmek için, yolun başlangıcına bileşeni ekleyin. Yukarıdaki örnekte yol değerini /$metadata/Temperature/sourceTimemyComponent/$metadata/Temperature/sourceTimeolarak değiştirerek bunu yapabilirsiniz.

Dekont

Bir özellikte sourceTime hem hem de değerini güncelleştirir ve daha sonra yalnızca özelliğin değerini güncelleştirirseniz, ilk güncelleştirmeden sourceTime gelen zaman damgası kalır.

Çakışan güncelleştirme çağrılarını işleme

Azure Digital Twins, gelen tüm isteklerin ardı ardına işlenmesini sağlar. Başka bir deyişle, birden çok işlev aynı özelliği aynı anda bir ikizde güncelleştirmeye çalışsa bile, çakışmayı işlemek için açık kilitleme kodu yazmanıza gerek yoktur.

Bu davranış her ikiz için geçerlidir.

Örneğin, bu üç çağrının aynı anda geldiği bir senaryo düşünün:

  • İkiz1 üzerinde A yazma özelliği
  • İkiz1'de B yazma özelliği
  • İkizde A özelliği yazma2

Twin1'i değiştiren iki çağrı birbiri ardına yürütülür ve her değişiklik için değişiklik iletileri oluşturulur. Twin2'yi değiştirme çağrısı, geldiğinde çakışma olmadan eşzamanlı olarak yürütülebilir.

Dijital ikiz silme

yöntemini kullanarak DeleteDigitalTwin() ikizleri silebilirsiniz. Ancak, bir ikizin yalnızca başka ilişkisi olmadığında silebilirsiniz. Bu nedenle, önce ikizin gelen ve giden ilişkilerini silin.

burada ikizleri ve ilişkilerini silmeye yönelik bir kod örneği verilmiştir. SDK DeleteDigitalTwin çağrısı, daha geniş örnek bağlamda nereye düştüğünü netleştirmek için vurgulanır.

private static async Task CustomMethod_DeleteTwinAsync(DigitalTwinsClient client, string twinId)
{
    await CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(client, twinId);
    await CustomMethod_FindAndDeleteIncomingRelationshipsAsync(client, twinId);
    try
    {
        await client.DeleteDigitalTwinAsync(twinId);
        Console.WriteLine("Twin deleted successfully");
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine($"*** Error:{ex.Message}");
    }
}

private static async Task CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
    // Find the relationships for the twin

    try
    {
        // GetRelationshipsAsync will throw an error if a problem occurs
        AsyncPageable<BasicRelationship> rels = client.GetRelationshipsAsync<BasicRelationship>(dtId);

        await foreach (BasicRelationship rel in rels)
        {
            await client.DeleteRelationshipAsync(dtId, rel.Id).ConfigureAwait(false);
            Console.WriteLine($"Deleted relationship {rel.Id} from {dtId}");
        }
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting relationships for {dtId} due to {ex.Message}");
    }
}

private static async Task CustomMethod_FindAndDeleteIncomingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
    // Find the relationships for the twin

    try
    {
        // GetRelationshipsAsync will throw an error if a problem occurs
        AsyncPageable<IncomingRelationship> incomingRels = client.GetIncomingRelationshipsAsync(dtId);

        await foreach (IncomingRelationship incomingRel in incomingRels)
        {
            await client.DeleteRelationshipAsync(incomingRel.SourceId, incomingRel.RelationshipId).ConfigureAwait(false);
            Console.WriteLine($"Deleted incoming relationship {incomingRel.RelationshipId} from {dtId}");
        }
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting incoming relationships for {dtId} due to {ex.Message}");
    }
}

Tüm dijital ikizleri silme

Tüm ikizlerin aynı anda nasıl silineceğiyle ilgili bir örnek için, Örnek istemci uygulamasıyla temel bilgileri keşfetme bölümünde kullanılan örnek uygulamayı indirin. CommandLoop.cs dosyası bunu bir CommandDeleteAllTwins() işlevde yapar.

Dekont

Bir örnekteki tüm modelleri, ikizleri ve ilişkileri aynı anda silmek istiyorsanız, İşleri Sil API'sini kullanın.

Çalıştırılabilir dijital ikiz kod örneği

Aşağıdaki çalıştırılabilir kod örneğini kullanarak bir ikiz oluşturabilir, ayrıntılarını güncelleştirebilir ve ikizini silebilirsiniz.

Örnek proje dosyalarını ayarlama

Kod parçacığı, Room.json örnek model tanımını kullanır. Model dosyasını kodunuzda kullanabilmek için indirmek için bu bağlantıyı kullanarak doğrudan GitHub'daki dosyaya gidin. Ardından, ekranda herhangi bir yere sağ tıklayın, tarayıcınızın sağ tıklama menüsünde Farklı kaydet'i seçin ve dosyayı Room.json olarak kaydetmek için Farklı Kaydet penceresini kullanın.

Ardından Visual Studio'da veya seçtiğiniz düzenleyicide yeni bir konsol uygulaması projesi oluşturun.

Ardından, çalıştırılabilir örneğin aşağıdaki kodunu projenize kopyalayın:

using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Azure;
using Azure.DigitalTwins.Core;
using Azure.Identity;
using System.IO;

namespace DigitalTwins_Samples
{
    class TwinOperationsSample
    {
        public static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            // Create the Azure Digital Twins client for API calls
            string adtInstanceUrl = "https://<your-instance-hostname>";
            var credentials = new DefaultAzureCredential();
            var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credentials);
            Console.WriteLine($"Service client created – ready to go");

            // Upload models
            Console.WriteLine($"Upload a model");
            string dtdl = File.ReadAllText("<path-to>/Room.json");
            var models = new List<string> { dtdl };
            // Upload the model to the service
            await client.CreateModelsAsync(models);

            // Create new digital twin
            // <CreateTwin_withHelper>
            string twinId = "myTwinID";
            var initData = new BasicDigitalTwin
            {
                Id = twinId,
                Metadata = { ModelId = "dtmi:example:Room;1" },
                // Initialize properties
                Contents =
                {
                    { "Temperature", 25.0 },
                    { "Humidity", 50.0 },
                },
            };

            // <CreateTwinCall>
            await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);
            // </CreateTwinCall>
            // </CreateTwin_withHelper>
            Console.WriteLine("Twin created successfully");

            //Print twin
            Console.WriteLine("--- Printing twin details:");
            await CustomMethod_FetchAndPrintTwinAsync(twinId, client);
            Console.WriteLine("--------");

            //Update twin data
            var updateTwinData = new JsonPatchDocument();
            updateTwinData.AppendAdd("/Temperature", 30.0);
            // <UpdateTwinCall>
            await client.UpdateDigitalTwinAsync(twinId, updateTwinData);
            // </UpdateTwinCall>
            Console.WriteLine("Twin properties updated");
            Console.WriteLine();

            //Print twin again
            Console.WriteLine("--- Printing twin details (after update):");
            await CustomMethod_FetchAndPrintTwinAsync(twinId, client);
            Console.WriteLine("--------");
            Console.WriteLine();

            //Delete twin
            await CustomMethod_DeleteTwinAsync(client, twinId);
        }

        private static async Task<BasicDigitalTwin> CustomMethod_FetchAndPrintTwinAsync(string twinId, DigitalTwinsClient client)
        {
            // <GetTwin>
            BasicDigitalTwin twin;
            // <GetTwinCall>
            Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
            twin = twinResponse.Value;
            // </GetTwinCall>
            Console.WriteLine($"Model id: {twin.Metadata.ModelId}");
            foreach (string prop in twin.Contents.Keys)
            {
                if (twin.Contents.TryGetValue(prop, out object value))
                    Console.WriteLine($"Property '{prop}': {value}");
            }
            // </GetTwin>

            return twin;
        }

        // <DeleteTwin>
        private static async Task CustomMethod_DeleteTwinAsync(DigitalTwinsClient client, string twinId)
        {
            await CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(client, twinId);
            await CustomMethod_FindAndDeleteIncomingRelationshipsAsync(client, twinId);
            try
            {
                await client.DeleteDigitalTwinAsync(twinId);
                Console.WriteLine("Twin deleted successfully");
            }
            catch (RequestFailedException ex)
            {
                Console.WriteLine($"*** Error:{ex.Message}");
            }
        }

        private static async Task CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(DigitalTwinsClient client, string dtId)
        {
            // Find the relationships for the twin

            try
            {
                // GetRelationshipsAsync will throw an error if a problem occurs
                AsyncPageable<BasicRelationship> rels = client.GetRelationshipsAsync<BasicRelationship>(dtId);

                await foreach (BasicRelationship rel in rels)
                {
                    await client.DeleteRelationshipAsync(dtId, rel.Id).ConfigureAwait(false);
                    Console.WriteLine($"Deleted relationship {rel.Id} from {dtId}");
                }
            }
            catch (RequestFailedException ex)
            {
                Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting relationships for {dtId} due to {ex.Message}");
            }
        }

        private static async Task CustomMethod_FindAndDeleteIncomingRelationshipsAsync(DigitalTwinsClient client, string dtId)
        {
            // Find the relationships for the twin

            try
            {
                // GetRelationshipsAsync will throw an error if a problem occurs
                AsyncPageable<IncomingRelationship> incomingRels = client.GetIncomingRelationshipsAsync(dtId);

                await foreach (IncomingRelationship incomingRel in incomingRels)
                {
                    await client.DeleteRelationshipAsync(incomingRel.SourceId, incomingRel.RelationshipId).ConfigureAwait(false);
                    Console.WriteLine($"Deleted incoming relationship {incomingRel.RelationshipId} from {dtId}");
                }
            }
            catch (RequestFailedException ex)
            {
                Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting incoming relationships for {dtId} due to {ex.Message}");
            }
        }
        // </DeleteTwin>

    }
}

Dekont

Şu anda sarmalayıcı sınıfını DefaultAzureCredential etkileyen ve kimlik doğrulaması sırasında hataya neden olabilecek bilinen bir sorun vardır. Bu sorunla karşılaşırsanız, çözmek için aşağıdaki isteğe bağlı parametreyle örnek DefaultAzureCredential oluşturmayı deneyebilirsiniz: new DefaultAzureCredential(new DefaultAzureCredentialOptions { ExcludeSharedTokenCacheCredential = true });

Bu sorun hakkında daha fazla bilgi için bkz . Azure Digital Twins bilinen sorunlar.

Projeyi yapılandırma

Ardından, proje kodunuzu yapılandırmak için aşağıdaki adımları tamamlayın:

  1. Daha önce indirdiğiniz Room.json dosyasını projenize ekleyin ve programınızın nerede bulacağını söylemek için koddaki yer tutucuyu değiştirin<path-to>.

  2. Yer tutucuyu <your-instance-hostname> Azure Digital Twins örneğinizin ana bilgisayar adıyla değiştirin.

  3. Projenize Azure Digital Twins ile çalışmak için gereken iki bağımlılık ekleyin. Birincisi .NET için Azure Digital Twins SDK'sının paketi, ikincisi ise Azure'da kimlik doğrulamasına yardımcı olacak araçlar sağlar.

    dotnet add package Azure.DigitalTwins.Core
    dotnet add package Azure.Identity
    

Örneği doğrudan çalıştırmak istiyorsanız yerel kimlik bilgilerini de ayarlamanız gerekir. Sonraki bölümde bunun üzerinden geçilir.

Yerel Azure kimlik bilgilerini ayarlama

Bu örnek, yerel makinenizde çalıştırdığınızda Azure Digital Twins örneğiyle kullanıcıların kimliğini doğrulamak için DefaultAzureCredential (kitaplığın bir parçasıAzure.Identity) kullanır. bir istemci uygulamasının Azure Digital Twins ile kimlik doğrulaması yapmanın farklı yolları hakkında daha fazla bilgi için bkz . Uygulama kimlik doğrulama kodu yazma.

ileDefaultAzureCredential, örnek yerel ortamınızda yerel Azure CLI'da veya Visual Studio ya da Visual Studio Code'da Azure oturumu açma gibi kimlik bilgilerini arar. Bu nedenle, örneğin kimlik bilgilerini ayarlamak için bu mekanizmalardan biriyle Azure'da yerel olarak oturum açmanız gerekir.

Kod örneklerini çalıştırmak için Visual Studio veya Visual Studio Code kullanıyorsanız, Azure Digital Twins örneğine erişmek için kullanmak istediğiniz Azure kimlik bilgileriyle bu düzenleyicide oturum açtığınızdan emin olun. Yerel CLI penceresi kullanıyorsanız Azure hesabınızda oturum açmak için komutunu çalıştırın az login . Bundan sonra, kod örneğinizi çalıştırdığınızda otomatik olarak kimliğiniz doğrulanmalıdır.

Örneği çalıştırma

Kurulum tamamlandıktan sonra örnek kod projesini çalıştırabilirsiniz.

Yukarıdaki programın konsol çıkışı aşağıdadır:

Screenshot of the console output showing that the twin is created, updated, and deleted.

Sonraki adımlar

Dijital ikizleriniz arasında ilişki oluşturmayı ve yönetmeyi öğrenin: