gpt4 book ai didi

c# - 如何在 EntityFramework Core 中使用部分类和部分 OnModelCreating 方法扩展 DbContext

转载 作者:太空狗 更新时间:2023-10-29 18:07:16 25 4
gpt4 key购买 nike

我正在使用 EF Core 和 DatabaseFirst 方法。我的 dbContext 由 Scaffold-DbContext 命令自动创建。

我需要将一些新的 DbSet 添加到 dbContext 中,并向 OnModelCreating 方法中添加一些额外的代码,但是在每个脚手架之后,添加的代码都会被删除,我必须每次都重新添加它。

我想做的是创建另一个部分 dbContext 类并将 protected override void OnModelCreating(ModelBuilder modelBuilder) 方法标记为部分

但出现错误:

A partial method cannot have access modifiers or the virtual, abstract, override, new, sealed, or extern modifiers.

A partial method may not have multiple implementing declarations

伪代码如下:

MyDbContext1.cs - 由 Scaffold-DbContext 生成

public partial class MyDbContext : DbContext
{
public MyDbContext()
{
}

public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}

public virtual DbSet<Client> Clients { get; set; }

protected override partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Client>(entity =>
{
// some code ...
}
}
}

MyDbContext2.cs - 我每次在脚手架后添加到 dbContext 中的代码:

public partial class MyDbContext
{
public virtual DbSet<JustAnotherEntity> AnotherEntity { get; set; }

protected override partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<JustAnotherEntity>(entity =>
{
entity.HasKey(e => new {e.Id, e.IdAction, e.IdState})
.ForSqlServerIsClustered(false);
});
}
}

最佳答案

EFCore 3 - 他们最终解决了这个问题!

您现在可以像这样在分部类中实现 OnModelCreatingPartial。注意 partial class and method 上的关键字:

public partial class RRStoreContext : DbContext
{
partial void OnModelCreatingPartial(ModelBuilder builder)
{
builder.Entity<RepeatOrderSummaryView>().HasNoKey();
}
}

如果您查看生成的上下文文件 - 就在 OnModelCreating(...) 的最后,您会看到...

 OnModelCreatingPartial(modelBuilder);

注意:我使用了脚手架,但我需要为存储过程手动添加 HasNoKey(使用没有其他脚手架的自定义返回类型)。

关于c# - 如何在 EntityFramework Core 中使用部分类和部分 OnModelCreating 方法扩展 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52182040/

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