C# 必须在cosmosdb delete operaiton中为此操作提供PartitionKey值
我正在尝试从Cosmos DB中删除一个文档 我的代码如下:C# 必须在cosmosdb delete operaiton中为此操作提供PartitionKey值,c#,asp.net,.net,azure,azure-cosmosdb,C#,Asp.net,.net,Azure,Azure Cosmosdb,我正在尝试从Cosmos DB中删除一个文档 我的代码如下: public async Task<IHttpActionResult> DeletePartner(string id) { var telemetry = new TelemetryClient(); try { if (!ModelState.IsValid) {
public async Task<IHttpActionResult> DeletePartner(string id)
{
var telemetry = new TelemetryClient();
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var customers = await CosmosStoreHolder.Instance.CosmosStoreCustomer.Query().Where(x=> x.PartnerId == id).ToListAsync();
var userStore = CosmosStoreHolder.Instance.CosmosStoreUser;
var users = await userStore.Query().Where(x => x.PartnerId == id).ToListAsync(); ;
if (customers.Count> 0 || users.Count>0)
{
return BadRequest("You cant delete partners with existing customers or users");
}
else
{
var result = await CosmosStoreHolder.Instance.CosmosStorePartner.RemoveByIdAsync(id, "/CosmosEntityName");
return Ok(result);
}
}
catch (Exception ex)
{
string guid = Guid.NewGuid().ToString();
var dt = new Dictionary<string, string>
{
{ "Error Lulo: ", guid }
};
telemetry.TrackException(ex, dt);
return BadRequest("Error Lulo: " + guid);
}
}
}
[SharedCosmosCollection("shared")]
public class Partner : ISharedCosmosEntity
{
/// <summary>
/// Partner id
/// </summary>
[JsonProperty("Id")]
public string Id { get; set; }
/// <summary>
/// Partner name
/// </summary>
public string PartnerName { get; set; }
/// <summary>
/// Partner contact name
/// </summary>
public string PartnerContact { get; set; }
/// <summary>
/// Partner contact phone
/// </summary>
public string PartnerPhone { get; set; }
/// <summary>
/// Partner contact Office 365 domain
/// </summary>
public string PartnerDomain { get; set; }
/// <summary>
/// Partner type, silver, gold or platinum
/// </summary>
[ValidEnumValue]
public PartnerType PartnerType { get; set; }
/// <summary>
/// Partner start date
/// </summary>
public DateTime StartDate { get; set; }
/// <summary>
/// Partner end date
/// </summary>
public DateTime EndDate { get; set; }
/// <summary>
/// Parter enabled
/// </summary>
public bool Enabled { get; set; }
/// <summary>
/// CosmosEntityname
/// </summary>
[CosmosPartitionKey]
public string CosmosEntityName { get; set; }
}
/// <summary>
/// Partner type Enum
/// </summary>
public enum PartnerType
{
///Silver
Silver,
///Gold
Gold,
///Platinum
Platinum
}
公共异步任务DeletePartner(字符串id)
{
var telemetry=新遥测客户端();
尝试
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
var customers=wait CosmosStoreHolder.Instance.CosmosStoreCustomer.Query().Where(x=>x.PartnerId==id.toListSync();
var userStore=CosmosStoreHolder.Instance.CosmosStoreUser;
var users=await userStore.Query().Where(x=>x.PartnerId==id.toListSync();
if(customers.Count>0 | | users.Count>0)
{
return BadRequest(“您不能删除现有客户或用户的合作伙伴”);
}
其他的
{
var result=await CosmosStoreHolder.Instance.CosmosStorePartner.RemoveByIdAsync(id,“/cosmossentityname”);
返回Ok(结果);
}
}
捕获(例外情况除外)
{
字符串guid=guid.NewGuid().ToString();
var dt=新字典
{
{“错误Lulo:,guid}
};
遥测.跟踪异常(ex,dt);
返回BADDREQUEST(“错误Lulo:+guid”);
}
}
}
[SharedCommosCollection(“shared”)]
公共类合作伙伴:iSharedCommentity
{
///
///合作伙伴id
///
[JsonProperty(“Id”)]
公共字符串Id{get;set;}
///
///合作伙伴名称
///
公共字符串PartnerName{get;set;}
///
///合作伙伴联系人姓名
///
公共字符串PartnerContact{get;set;}
///
///合作伙伴联系电话
///
公共字符串PartnerPhone{get;set;}
///
///合作伙伴联系Office 365域
///
公共字符串PartnerDomain{get;set;}
///
///合作伙伴类型,银、金或白金
///
[有效值]
公共PartnerType PartnerType{get;set;}
///
///合作伙伴开始日期
///
公共日期时间起始日期{get;set;}
///
///合作伙伴结束日期
///
公共日期时间结束日期{get;set;}
///
///合作伙伴启用
///
已启用公共bool的{get;set;}
///
///宇宙感知名称
///
[CosmospationKey]
公共字符串CosmosEntityName{get;set;}
}
///
///伙伴类型枚举
///
公共枚举伙伴类型
{
///银币
银色,
///黄金
黄金,
///白金
铂金
}
但我有一个错误:
必须为此操作提供PartitionKey值
我试图将字符串“/cosmossentityname”作为第二个参数发送,但它不起作用
我正在使用宇航员您需要使用请求选项。例如,如果您的集合是按CosmosEntityName分区的
await this.documentClient.DeleteDocumentAsync(productDocument._self, new RequestOptions { PartitionKey = new Microsoft.Azure.Documents.PartitionKey(productDocument.CosmosEntityName) });
编辑:
这是你需要的
您需要提供分区键值,而不是分区键
删除时定义。您的删除请求应该如下所示,
假设id是您的分区密钥
您需要将要删除的元素的分区键的值作为第二个参数传递,而不是路径和属性名
var result = await CosmosStoreHolder.Instance.CosmosStorePartner.RemoveByIdAsync(id, "<partition key value for that id>");
var result=wait-CosmosStoreHolder.Instance.CosmosStorePartner.RemoveByIdAsync(id,”);
由于您定义为PK的属性是
cosmonentityname
,因此您需要该文档的属性值。我的实体中没有self。为什么是cosmoneut?您可以直接使用cosmosdb sdk。但是我更新了我的答案,因为我已经使用cosmonaut超过2年了,它比官方SDK更好,但是方法调用非常相似。RemoveByIdAsync
不是Cosmos DB SDK的一部分,你能分享该方法的代码以及它如何调用Cosmos DB SDK吗?它是cosmonaut的一部分,哪一个是cosmosdb使用最广泛的第三方sdk
var result = await CosmosStoreHolder.Instance.CosmosStorePartner.RemoveByIdAsync(id, "<partition key value for that id>");