gpt4 book ai didi

c# - .NET Core Cosmos 不填充 ID 的私有(private) Setter

转载 作者:行者123 更新时间:2023-11-30 20:25:08 25 4
gpt4 key购买 nike

我是 .NET Core 的新手,如果这个问题不太适合 Stackoverdlow,请原谅。我在 .NET Core 2.1 中使用 CosmosDB。我有一个简单的类(class),我坚持在下面的一个集合中。

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;
}
}

请注意私有(private)集,因为 Id 是由数据库自动生成的,不应由调用者设置。

当我保存记录并检索它们时,Id 属性未填充。但是,如果我将 setter 更改为 public,它就可以正常工作。这是一个非常简单的示例,但理想情况下,我应该能够将 Id setter 设为私有(private),因为它在类外应该是不可变的。我过去在 Java 中使用过像 Hibernate 这样的库,因为该字段是通过反射设置的,所以效果很好。

.NET Core 和 CosmosDB 有办法处理私有(private) setter 吗?在尝试实现 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; }
}

最佳答案

由于 CosmosDb 具有预定义的属性 id,您需要 JSON 序列化器绑定(bind)到它,并且由于这是区分大小写的,下面是允许您这样做的属性:

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; }
}

关于c# - .NET Core Cosmos 不填充 ID 的私有(private) Setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com