.NET6 EFCore 和 Cosmos 迁移问题。需要一些帮助。
大家好。我是 .Net 世界的新手,我面临着 Google 未能帮助我解决的问题。你是我最后的问候。
所以。我正在尝试使用 EFCore 6.0.3 从我的小 HomeControlCenter 项目连接到 Azure Cosmos DB
错误:
Unable to resolve service for type 'Microsoft.EntityFrameworkCore.Migrations.IMigrator'. This is often because no database provider has been configured for this DbContext. A provider can be configured by overriding the 'DbContext.OnConfiguring' method or by using 'AddDbContext' on the application service provider. If 'AddDbContext' is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext>
object in its constructor and passes it …Run Code Online (Sandbox Code Playgroud) 我有一个 SQL API Cosmos DB 集合,其 id 和分区键均等于/id。
给定 ID 列表,我需要获取所有这些文档。使用 .NET SDK (v3.25) 时,建议使用以下哪种 Container 类方法来获得最低延迟:
ReadItemAsync来读取所有文档。ReadManyItemsAsync阅读所有文档。GetItemQueryIterator与以下形式的 SQL 查询一起使用SELECT * FROM c where c.id in ('id-1', 'id-2', ...)。有没有办法将Document的唯一ID与我班级的属性相关联?
例如:
public class Product
{
//Associate this to ID
public string ProductId { get; set; }
public string UserId
{
get;
set;
}
public string ProductName
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我不想为我的对象创建和维护唯一的ID,而是重用DocumentDB在编写文档后创建的Id.
就......而言
按照重要的顺序,但不介意一般的答案,因为我很欣赏我可能要求太多:)
谢谢
编辑:我正在寻找一个将作为单一权威数据存储的数据库,我需要存储的文件的所有属性,以便出于各种商业原因进行索引.因此我知道其他解决方案不会做我想要的.
假设我将记录插入以下模型的Azure DocumentDb中:
public class Message
{
[JsonProperty(PropertyName = "tid")]
public string Id { get; set; }
[JsonProperty(PropertyName = "start")]
public DateTimeOffset StartAt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
它们都自动存储为字符串.我希望能够查询StartAt,所以我在其上添加了一个RngeIndex.我使用Azure门户验证索引是否正常工作.
有了这个,我加载DocumentDb .NET SDK并尝试以下查询:
var since = DateTimeOffset.UtcNow.Subtract(duration);
return Client.CreateDocumentQuery<T>(Collection.DocumentsLink)
.Where(m => m.AtStart > since)
.AsEnumerable();
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误
[DocumentQueryException: Constant of type 'System.DateTimeOffset' is not supported.]
Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitConstant(ConstantExpression inputExpression) +3204
Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitBinary(BinaryExpression inputExpression, TranslationContext context) +364
Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitBinary(BinaryExpression inputExpression, TranslationContext context) +349
Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitScalarLambda(Expression inputExpression, TranslationContext context) +230
Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitWhere(ReadOnlyCollection`1 arguments, TranslationContext context) +55
Microsoft.Azure.Documents.Linq.ExpressionToSql.VisitMethodCall(MethodCallExpression inputExpression, TranslationContext …Run Code Online (Sandbox Code Playgroud) 尝试保存对已在分区集合中创建的存储过程的修改时,我收到以下错误:
无法保存脚本
以下是Azure门户中的详细信息:
操作名称无法保存脚本时间戳Fri Feb 17 2017 08:46:32 GMT-0500(东部标准时间)事件发起者 - 说明数据库帐户:MyDocDbAccount,脚本:bulkImport,消息:{"code":400," body":"{\"code \":\"BadRequest \",\"message \":\" 不支持对具有多个分区的集合中的脚本进行替换和upsert.
有问题的存储过程是可在此处找到的示例"bulkImport"脚本.
当我从DocumentDB序列化JSON对象时,我Control没有OptionsControl使用Options属性反序列化为。
我的课程如下Control:
public class Control : IControl
{
public Guid Id { get; set; }
public virtual Enums.ControlType Type { get; set; }
public string PropertyName { get; set; }
public string ControlCssClass { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我也有OptionsControl,它继承自Control:
public class OptionsControl : Control
{
public IDictionary<string, string> Options;
}
Run Code Online (Sandbox Code Playgroud)
我也有ClickableControl:
public class ClickableControl : Control
{
public string …Run Code Online (Sandbox Code Playgroud) 看到这个问题后,我不确定为什么DocDb实例的以下代码不起作用:
var userApps = _docs.CreateDocumentQuery(UriFactory.CreateDocumentCollectionUri(Constants.Databases.Applications.ID, Constants.Databases.Applications.Collections.USER_APPS),
new SqlQuerySpec(@"SELECT r.appId FROM ROOT r WHERE r.userId = @userId", (@"@userId", userId).ToSqlParameters()))
.ToList()
.Select(s => (string)s.appId);
var query = _docs.CreateDocumentQuery<Document>(UriFactory.CreateDocumentCollectionUri(Constants.Databases.Applications.ID, Constants.Databases.Applications.Collections.APP_DEFINITIONS),
new SqlQuerySpec(@"SELECT r.id, r.appName FROM ROOT r WHERE r.appId IN (@userApps)", (@"@userApps", userApps.ToArray()).ToSqlParameters()),
new FeedOptions { EnableCrossPartitionQuery = true })
.AsDocumentQuery();
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,尽管我知道数据应该返回我一个结果集,但每次它都返回为空。
.Select()将我输入的字符串返回string.Join到以逗号分隔的列表中。
例如:
var userApps = string.Join(@",", _docs.CreateDocumentQuery(UriFactory.CreateDocumentCollectionUri(Constants.Databases.Applications.ID, Constants.Databases.Applications.Collections.USER_APPS),
new SqlQuerySpec(@"SELECT r.appId FROM ROOT r WHERE r.userId = @userId", (@"@userId", userId).ToSqlParameters())) …Run Code Online (Sandbox Code Playgroud) 我试图在一个集合上设置一个触发器,它似乎没有绊倒.触发器是使用Azure门户准备的.我正在尝试特定的逻辑 - 但最后只是在Azure站点上放置了一个示例.触发器逻辑如下:
var context = getContext();
var request = context.getRequest();
// document to be created in the current operation
var documentToCreate = request.getBody();
// validate properties
if (!("timestamp" in documentToCreate))
{
var ts = new Date();
documentToCreate["my timestamp"] = ts.getTime();
}
// update the document that will be created
request.setBody(documentToCreate);
Run Code Online (Sandbox Code Playgroud)
触发器无效.似乎没有出现错误,我不确定发生了什么.
注意:触发器是预先设置的触发器.对于我列出的触发器逻辑,我没有使用"my timestamp"属性创建文档.我还测试了相同概念中的其他场景,我想在创建的文档中添加属性.
我已经阅读了一些有关微服务的信息,并且最受欢迎的方法似乎是为每个微服务提供一个单独的数据库。关于Azure的CosmosDB,这是否意味着每个服务都有单独的表?架构此的最佳方法是什么?