{"id":116,"date":"2014-12-16T19:35:06","date_gmt":"2014-12-16T19:35:06","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/"},"modified":"2014-12-16T19:35:06","modified_gmt":"2014-12-16T19:35:06","slug":"introducing-couchbase-net-sdk-20-beta-2","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/introducing-couchbase-net-sdk-20-beta-2\/","title":{"rendered":"Introducing the Couchbase .NET SDK 2.0 Beta 2!"},"content":{"rendered":"\n<p>Today we are releasing a Beta 2 of the Couchbase .NET SDK 2.0.\u00a0\u00a0 This is an exciting update in our continued commitment to the .NET platform, and the .NET community.\u00a0 We&#8217;ve even managed to squeeze in a few new features before the GA Release in response to customer demand.\u00a0\u00a0 I&#8217;m excited to announce the inclusion of Bulk Methods and a sneak peak at Asynchronous Views and N1QL queries!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What\u2019s in this release?<\/h2>\n\n\n\n<p>Feature-wise it builds on the previous releases (DP1, DP2 and Beta) and adds the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bulk methods: Upsert and Get<\/li>\n\n\n<li>Asynchronous Views<\/li>\n\n\n<li>Asynchronous N1QL queries (Experimental &#8211; N1QL is still DP3)<\/li>\n\n\n<li>Common Data Types &#8211; consistent typing of values amongst SDK\u2019s<\/li>\n\n\n<li>Management API &#8211; for managing Clusters, Buckets and Views<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bulk Methods: Upsert and Get<\/h3>\n\n\n\n<p>Bulk methods allow the application to send a set of keys in a single request and then wait for the results. For example:<\/p>\n\n\n\n<p><span>using<\/span><span>(<\/span>var cluster <span>=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span>new<\/span><\/a> Cluster<span>(<\/span><span>)<\/span><span>)<\/span><br><span>{<\/span><br>\u00a0 \u00a0 <span>using<\/span> <span>(<\/span>var bucket <span>=<\/span> cluster<span>.<\/span><span>OpenBucket<\/span><span>(<\/span><span>)<\/span><span>)<\/span><br>\u00a0 \u00a0 <span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 var items <span>=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span>new<\/span><\/a> Dictionary<span><span>string<\/span>, dynamic<span>&gt;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><span>&#8220;Key1&#8221;<\/span>, <span>&#8220;string&#8221;<\/span><span>}<\/span>,<br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><span>&#8220;Key2&#8221;<\/span>, <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span>new<\/span><\/a> <span>{<\/span>Foo <span>=<\/span> <span>&#8220;Bar&#8221;<\/span>, Baz <span>=<\/span> <span>2<\/span><span>}<\/span><span>}<\/span>,<br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><span>&#8220;Key3&#8221;<\/span>, <span>2<\/span><span>}<\/span>,<br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><span>&#8220;Key4&#8221;<\/span>, <span>5.8<\/span><span>}<\/span>,<br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><span>&#8220;Key5&#8221;<\/span>, <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span>new<\/span><\/a><span>[<\/span><span>]<\/span> <span>{<\/span>0x00, 0x00<span>}<\/span><span>}<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span>}<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 var multiUpsert <span>=<\/span> bucket<span>.<\/span><span>Upsert<\/span><span>(<\/span>items<span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 <span>foreach<\/span> <span>(<\/span>var item <span>in<\/span> multiUpsert<span>)<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Assert<span>.<\/span><span>IsTrue<\/span><span>(<\/span>item<span>.<\/span><span>Value<\/span><span>.<\/span><span>Success<\/span><span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 <span>}<\/span><br>\u00a0 \u00a0<span>}<\/span><br><span>}<\/span><\/span><\/p>\n\n\n\n<p>Above we are creating a Cluster object, and opening the default Bucket. After that we build a dictionary in with it\u2019s keys defined as string and it\u2019s values defined as a dynamic Type. We then add a number of keys and associated values; notice that each value is a different Type: a string, an anonymous Type, an integer, a decimal and finally a byte array. We are then calling IBucket.Upsert(&#8230;) and passing in the dictionary. We are then iterating through the results checking to see if each operation was successful.<\/p>\n\n\n\n<p>Behind the scenes we are leveraging the Task Parallel Library to fire off each operation in parallel. For this overload the default ParallelOptions are used, but there are overloads that allow you to pass in your own ParallelOptions (including your own CancellationToken) and to control the size of each partition of keys that will be processed per iteration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Asynchronous Views<\/h3>\n\n\n\n<p>Although support for Asynchronous CRUD (InsertAsync, UpsertAsync, etc) operations didn\u2019t make it into the GA, Asynchronous Views did. The implementation is based off of the Task Asynchrony Pattern (TAP) that is familiar to most .NET developers and supports async\/await keywords introduced in .NET 4.0:<\/p>\n\n\n\n<p><span>public<\/span> async <span>void<\/span> QueryAsync<span>(<\/span><span>)<\/span><br><span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 <span>using<\/span> <span>(<\/span>var bucket <span>=<\/span> _cluster<span>.<\/span><span>OpenBucket<\/span><span>(<\/span><span>&#8220;beer-sample&#8221;<\/span><span>)<\/span><span>)<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var query <span>=<\/span> bucket<span>.<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>CreateQuery<\/span><span>(<\/span><span>&#8220;beer&#8221;<\/span>, <span>&#8220;brewery_beers&#8221;<\/span><span>)<\/span><span>.<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>Limit<\/span><span>(<\/span><span>10<\/span><span>)<\/span><span>;<\/span>\n<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var result <span>=<\/span> await bucket<span>.<\/span><span>QueryAsync<\/span><span>dynamic<span>&gt;<\/span><span>(<\/span>query<span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>foreach<\/span> <span>(<\/span>var row <span>in<\/span> result<span>.<\/span><span>Rows<\/span><span>)<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Console<span>.<\/span><span>WriteLine<\/span><span>(<\/span>row<span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>}<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 <span>}<\/span><br><span>}<\/span><\/span><\/p>\n\n\n\n<p>Here we are opening the \u201cbeer-sample\u201d bucket from an already created Cluster object and then creating a query that will target the \u201cbrewery_beers\u201d View that is defined by the \u201cbeer\u201d design document. Importantly notice that the we are using the await keyword to signal an asynchronous wait and that calling method has the async keyword defined, also the name of the method that is executing the query called is postfixed with \u201cAsync\u201d: QueryAsync<t>(IViewQuery query). What is happening here is that the query request will be fired off an a ThreadPool thread and not off of the main thread. Cool stuff.<\/t><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Asynchronous N1QL Queries (Experimental)<\/h3>\n\n\n\n<p>Similar to asynchronous Views, we have added overloads for executing N1QL queries asynchronously using async\/await keywords:<\/p>\n\n\n\n<p><span>public<\/span> async <span>void<\/span> QueryN1QLAsync<span>(<\/span><span>)<\/span><br><span>{<\/span><br>\u00a0 \u00a0 <span>using<\/span> <span>(<\/span>var bucket <span>=<\/span> _cluster<span>.<\/span><span>OpenBucket<\/span><span>(<\/span><span>)<\/span><span>)<\/span><br>\u00a0 \u00a0 <span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span>const<\/span> <span>string<\/span> query <span>=<\/span> <span>&#8220;SELECT * &#8220;<\/span> <span>+<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span>&#8220;FROM tutorial &#8220;<\/span> <span>+<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span>&#8220;WHERE fname = &#8216;Ian'&#8221;<\/span><span>;<\/span>\n<\/p>\n\n\n\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var result <span>=<\/span> await bucket<span>.<\/span><span>QueryAsync<\/span><span>dynamic<span>&gt;<\/span><span>(<\/span>query<span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>foreach<\/span> <span>(<\/span>var row <span>in<\/span> result<span>.<\/span><span>Rows<\/span><span>)<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Console<span>.<\/span><span>WriteLine<\/span><span>(<\/span>row<span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span>}<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0<span>}<\/span><br>\u00a0<span>}<\/span><\/span><\/p>\n\n\n\n<p>Once again we have added the \u201casync\u201d keyword to the signature of the method executing the query and then used the \u201cawait\u201d keyword to do an asynchronous wait while query is executing off of the main thread and on a ThreadPool thread. Once the call returns, we iterate through the results just like any other N1QL query.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Common Data Types<\/h3>\n\n\n\n<p>It\u2019s fairly common an enterprise environment to have one or more teams of developers using more than one platform to deliver software solutions satisfying the business needs of the organization. For example, a tier written in Java exposing core services to third-parties and another tier written in .NET consuming the data pushed in by the Java tier. In situations like this where one platform is writing data into Couchbase and another platform is reading that data, it\u2019s important that underlying data type of each item stored in Couchbase are treated the same across both platforms and their respective SDK\u2019s.<\/p>\n\n\n\n<p>In the past, their has been some inconsistency on how the various SDK\u2019s handled transcoding of types, but that changes in 2.0 SDK\u2019s. Now when one SDK, say Python, stores a document or value, when another platform reads that value, it will be transcoded as the same type. This done by simply treating a subset of types as either JSON, strings, binary data or as a \u201cprivate\u201d type for backwards compatibility. This type information is stored as a \u201cCommon Flag\u201d within the documents metadata and used by the SDK\u2019s to determine how to handle transcoding consistently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Management API<\/h3>\n\n\n\n<p>The last major feature released in GA is an all new Management API for performing Cluster and Bucket level tasks such as creating and removing Buckets, Design Document and Views, and adding and removing nodes from a Cluster.<\/p>\n\n\n\n<p>The management API can be broken down into two discrete types of operations: those which are performed on a Bucket and those which are performed on the Cluster. Each are represented by their own respective manager objects, that are created by the Cluster object\u2019s factory methods.<\/p>\n\n\n\n<p>Here is an example of adding a node to a Cluster:<\/p>\n\n\n\n<p><span>using<\/span> <span>(<\/span>var cluster <span>=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span>new<\/span><\/a> Cluster<span>(<\/span>configuration<span>)<\/span><span>)<\/span><br><span>{<\/span><br>\u00a0 \u00a0 var clusterManager <span>=<\/span> cluster<span>.<\/span><span>CreateManager<\/span><span>(<\/span><span>&#8220;Administrator&#8221;<\/span>, <span>&#8220;password&#8221;<\/span><span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 var result <span>=<\/span> clusterManager<span>.<\/span><span>AddNode<\/span><span>(<\/span><span>&#8220;192.168.56.103&#8221;<\/span><span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 Assert<span>.<\/span><span>IsTrue<\/span><span>(<\/span>result<span>.<\/span><span>Success<\/span><span>)<\/span><span>;<\/span><br><span>}<\/span><\/p>\n\n\n\n<p>First we create a Cluster object, which is the same object we use to open Buckets, passing in a configuration that tells the Cluster where the remote cluster exists. Then we call the CreateManager(&#8230;) factory method passing in our cluster\u2019s administrative username and password. Once we have authenticated, we add a new node to the cluster and check to see that the request was honored as expected.<\/p>\n\n\n\n<p>In the next example, a Bucket level administrative task will be performed: added a new Design Document and View to a Bucket.<\/p>\n\n\n\n<p><span>using<\/span> <span>(<\/span>var cluster <span>=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span>new<\/span><\/a> Cluster<span>(<\/span>configuration<span>)<\/span><span>)<\/span><br><span>{<\/span><br>\u00a0 \u00a0 <span>using<\/span> <span>(<\/span>var bucket <span>=<\/span> cluster<span>.<\/span><span>OpenBucket<\/span><span>(<\/span><span>)<\/span><span>)<\/span><br>\u00a0 \u00a0 <span>{<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 var manager <span>=<\/span> bucket<span>.<\/span><span>CreateManager<\/span><span>(<\/span><span>&#8220;Administrator&#8221;<\/span>, <span>&#8220;&#8221;<\/span><span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 var designDoc <span>=<\/span> File<span>.<\/span><span>ReadAllText<\/span><span>(<\/span><span>@&#8221;Data<span><\/span>DesignDocs<span><\/span>by_field.json&#8221;<\/span><span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 var result <span>=<\/span> manager<span>.<\/span><span>InsertDesignDocument<\/span><span>(<\/span><span>&#8220;by_field&#8221;<\/span>, designDoc<span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 \u00a0 \u00a0 Assert<span>.<\/span><span>IsTrue<\/span><span>(<\/span>result<span>.<\/span><span>Success<\/span><span>)<\/span><span>;<\/span><br>\u00a0 \u00a0 <span>}<\/span><br><span>}<\/span><\/p>\n\n\n\n<p>Here we are creating a Cluster object, then opening the default Bucket and using a factory method to create the BucketManager object. Once we have the manager, we open a file containing a Design Document and View as JSON and use the InsertDesignDocument(..) method to add the Design Document \u201cby_field\u201d to the Bucket. Besides inserting a design document, additional methods exist for updating an existing design document, getting a design document or all of the design documents and for removing a design document.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What\u2019s Changed?<\/h2>\n\n\n\n<p>Between Beta and Beta 2, a number of changes have occurred within the SDK. For the most part these are either additive or internal and will not impact users which have started using the 2.0 SDK. However, there are a couple of changes which are breaking changes, most notably:<\/p>\n\n\n\n<p>A number of other minor changes mainly involving the renaming and\/or reordering of parameters have also occurred. \u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Couchase.CouchbaseCluster has been renamed to Couchbase.Cluster<\/li>\n\n\n<li>CouchbaseBucket and MemchachedBucket have been moved from Couchbase.Core.Buckets to the main Couchbase namespace.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What\u2019s not in this release?<\/h2>\n\n\n\n<p>While we strive to get as many features as possible into a release, there are always more features than cycles available it seems and some features did not make their way into GA. Most notably:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Replica reads: allowing the client to read from one or more replicas. This is primarily used for rebalance scenarios when a \u201cNot My VBucket\u201d could be encountered.<\/li>\n\n\n<li>Asynchronous CRUD operations using async\/await<\/li>\n\n\n<li>Pluggable JSON parser: the ability to use the JSON serializer\/deserializer of your choice. Currently the client relies on Newtonsoft.JSON.<\/li>\n\n\n<li>Per connection TCP heartbeat settings: currently this is configured at the OS level via KeepAliveTime on Windows: https:\/\/technet.microsoft.com\/en-us\/library\/cc782936%28WS.10%29.aspx<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How to Get It<\/h2>\n\n\n\n<p>The binaries our available in S3, the source code is on Github, and the packages are available on Nuget:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Binaries are <a href=\"https:\/\/packages.couchbase.com.s3.amazonaws.com\/clients\/net\/2.0\/beta2\/Couchbase-Net-Client-Beta2.zip\">here.<\/a><\/li>\n\n\n<li>The repo is <a href=\"https:\/\/github.com\/couchbase\/couchbase-net-client\">here<\/a>.<\/li>\n\n\n<li>The NuGet packages are <a href=\"https:\/\/www.nuget.org\/packages\/CouchbaseNetClient\/2.0.0-beta2\">here<\/a>.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Acknowledgments<\/h2>\n\n\n\n<p>Being an Open Source project, the Couchbase .NET SDK depends upon contributions no matter how small, from the community. An extra special thanks to the following who submitted pull requests and\/or issued bug reports:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Matt Nischan<\/li>\n\n\n<li>Vojta Jakubec<\/li>\n\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Today we are releasing a Beta 2 of the Couchbase .NET SDK 2.0.\u00a0\u00a0 This is an exciting update in our continued commitment to the .NET platform, and the .NET community.\u00a0 We&#8217;ve even managed to squeeze in a few new features before the GA Release in response to customer demand.\u00a0\u00a0 I&#8217;m excited to announce the inclusion [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":18,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[33,66,67],"tags":[],"ppma_author":[32],"class_list":["post-116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-c","category-c-sharp"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Introducing the Couchbase .NET SDK 2.0 Beta 2! - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/introducing-couchbase-net-sdk-20-beta-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing the Couchbase .NET SDK 2.0 Beta 2!\" \/>\n<meta property=\"og:description\" content=\"Today we are releasing a Beta 2 of the Couchbase .NET SDK 2.0.\u00a0\u00a0 This is an exciting update in our continued commitment to the .NET platform, and the .NET community.\u00a0 We&#8217;ve even managed to squeeze in a few new features before the GA Release in response to customer demand.\u00a0\u00a0 I&#8217;m excited to announce the inclusion [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/introducing-couchbase-net-sdk-20-beta-2\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:35:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jeffrysmorris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/\"},\"author\":{\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/b678bdd9f7b21a33d43ea965865a3341\"},\"headline\":\"Introducing the Couchbase .NET SDK 2.0 Beta 2!\",\"datePublished\":\"2014-12-16T19:35:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/\"},\"wordCount\":1476,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"articleSection\":[\".NET\",\"C\\\/C++\",\"C#\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/\",\"name\":\"Introducing the Couchbase .NET SDK 2.0 Beta 2! - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:35:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/introducing-couchbase-net-sdk-20-beta-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing the Couchbase .NET SDK 2.0 Beta 2!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/b678bdd9f7b21a33d43ea965865a3341\",\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g73188ee2831025d81740e12e1ed80812\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"caption\":\"Jeff Morris, Senior Software Engineer, Couchbase\"},\"description\":\"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/jeffrysmorris\"],\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/es\\\/author\\\/jeff-morris\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing the Couchbase .NET SDK 2.0 Beta 2! - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/introducing-couchbase-net-sdk-20-beta-2\/","og_locale":"es_MX","og_type":"article","og_title":"Introducing the Couchbase .NET SDK 2.0 Beta 2!","og_description":"Today we are releasing a Beta 2 of the Couchbase .NET SDK 2.0.\u00a0\u00a0 This is an exciting update in our continued commitment to the .NET platform, and the .NET community.\u00a0 We&#8217;ve even managed to squeeze in a few new features before the GA Release in response to customer demand.\u00a0\u00a0 I&#8217;m excited to announce the inclusion [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/introducing-couchbase-net-sdk-20-beta-2\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:35:06+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Jeff Morris, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@jeffrysmorris","twitter_misc":{"Written by":"Jeff Morris, Senior Software Engineer, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/"},"author":{"name":"Jeff Morris, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341"},"headline":"Introducing the Couchbase .NET SDK 2.0 Beta 2!","datePublished":"2014-12-16T19:35:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/"},"wordCount":1476,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","articleSection":[".NET","C\/C++","C#"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/","url":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/","name":"Introducing the Couchbase .NET SDK 2.0 Beta 2! - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:35:06+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing the Couchbase .NET SDK 2.0 Beta 2!"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341","name":"Jeff Morris, Senior Software Engineer, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g73188ee2831025d81740e12e1ed80812","url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","caption":"Jeff Morris, Senior Software Engineer, Couchbase"},"description":"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).","sameAs":["https:\/\/x.com\/jeffrysmorris"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/jeff-morris\/"}]}},"acf":[],"authors":[{"term_id":32,"user_id":21,"is_guest":0,"slug":"jeff-morris","display_name":"Jeff Morris, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=116"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/116\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/18"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=116"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}