未填充ID的.NET Core Cosmos专用设置程序

时间:2018-09-03 20:46:26

标签: c# .net-core azure-cosmosdb

我是.NET Core的新手,如果这个问题不太适合Stackoverdlow,请原谅。我将CosmosDB与.NET Core 2.1结合使用。我有一个简单的课,我坚持下面的一个集合。

public class Customer
{
    public string Id { get; private set; }
    public string FirstName { get; private set; }
    public string LastName { get; private set; }

    public Customer(string firstName, string lastName) {

        if (string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(lastName))
        {
            throw new ArgumentException("First and Last name are required");
        }

        this.FirstName = firstName;
        this.LastName = lastName;
    }
}

请注意私有集,因为ID是由数据库自动生成的,并且永远不应由调用方设置。

当我保存记录并检索它们时,不会填充Id属性。但是,如果我将二传手改为公开,那就很好了。这是一个非常简单的示例,但理想情况下,我应该能够将ID设置程序设为私有,因为它在类外应该是不变的。过去,我曾经在Java中使用过Hibernate之类的库,因为该字段是通过反射设置的,所以在此方面效果很好。

.NET Core和CosmosDB是否可以处理私有设置程序?在尝试实现OOP / DDD方法时,我可以看到在像Order这样的域上这将是一个问题。

public class Order
{
    public int Id { get; private set; }
    public IList<LineItem> LineItems { get; private set; }

    public void AddLineItem(LineItem lineItem) {
        // do some business logic, encapsulatng the line items
        // IE don't just let the caller have free reign 
    }
}

public class LineItem 
{
    public string SKU { get; set; }
    public int Qty { get; set; }
    public decimal PricePerUnit { get; set; }
}

1 个答案:

答案 0 :(得分:4)

由于CosmosDb具有预定义的属性id,因此您需要JSON序列化程序绑定到它,并且由于这是区分大小写的,因此以下是允许您执行此操作的属性:

public class Customer
{
    [JsonProperty("id")]
    public string Id { get; private set; }
    // other members
}

个人而言,我更喜欢添加另一个属性来存储所有未映射的属性

/// <summary>
/// Any unmapped properties from the JSON data deserializes into this property.
/// </summary>
[JsonExtensionData]
public IDictionary<string, JToken> UnmappedData { get; set; }

因此,至少在调试时,我意识到由于区分大小写,拼写错误等原因可能错过的任何属性。

有效地,我的CosmosDb模型基类如下:

/// <summary>
/// Implements auto generated Id property for CosmosDb Model
/// </summary>
public abstract class BaseModel
{
    /// <summary>
    /// PK for this model. (apart from the ResourceId which is internally generated by CosmoDb)
    /// If the user does not set this, the SDK will set this automatically to a GUID.
    /// </summary>
    [JsonProperty(PropertyName = "id")]
    public virtual string Id { get; set; }

    /// <summary>
    /// Any unmapped properties from the JSON data deserializes into this property.
    /// </summary>
    [JsonExtensionData]
    public IDictionary<string, JToken> UnmappedData { get; set; }
}