我正在尝试最近发布的实体框架 mongo 包mongo 驱动程序。我添加了一些代码以将新实体插入数据库。不幸的是,当我尝试访问 id 时,它总是返回 000000000000000000000000。我尝试向模型类添加一些属性,但这不起作用。
对于上下文,我使用了文档中的相同上下文
internal class MflixDbContext : DbContext
{
public DbSet<Movie> Movies { get; init; }
public static MflixDbContext Create(IMongoDatabase database) =>
new(new DbContextOptionsBuilder<MflixDbContext>()
.UseMongoDB(database.Client, database.DatabaseNamespace.DatabaseName)
.Options);
public MflixDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Movie>().ToCollection("movies");
}
}
模型类也是一样的,但是我添加了一些属性。
internal class Movie
{
[Key]
[BsonElement("_id")]
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public ObjectId _id { get; set; }
public string title { get; set; }
public string rated { get; set; }
public string plot { get; set; }
}
程序类(控制台应用程序)的代码如下
var client = new MongoClient("CONNECTIONSTRING");
var db = MflixDbContext.Create(client.GetDatabase("sample_mflix"));
var movie = db.Movies.First(m => m.title == "Back to the Future");
var test = new Movie()
{
plot = "test",
title = "test",
rated = "test"
};
await db.Movies.AddAsync(test);
await db.SaveChangesAsync();
Console.WriteLine(test.plot + " with id " + test._id);
终端中的输出为:test with id 000000000000000000000000
我尝试向模型类添加一些属性,但没有产生任何影响。我期望在
await db.SaveChangesAsync();
之后填充 id 字段
感谢您的阅读,祝您有美好的一天!
查看提供者本身的文档,它的示例没有使用任何属性,因此您指定的属性可能会混淆其提供者对 PK 的标识?您可以尝试删除所有
[Bson*]
和 [Key]
属性,看看是否开始按预期运行。
否则,EF 期望 PK 为标识列的默认约定基于“Id”、“{tablename}Id”或“{tablename}_Id”命名约定。您可以使用以下方式指定其他列名称:
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[BsonElement("_id")]
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public ObjectId _id { get; set; }
对于具有其他关系数据库提供程序的列,可以使用,因为它告诉 EF 不要在插入时发送 ID 值。但是,通常情况下,如果数据库设置了标识列,则忘记按约定无法识别的列名的此属性将导致数据库无法接受标识列的显式值的错误。 (例如使用 SQL Server 时)对于 MongoDB,您需要检查 Mongo 如何/是否处理标识列。