以下方法或属性 [ Entity Framework Core ] [ OnModelCreating ] 之间的调用不明确

Posted

技术标签:

【中文标题】以下方法或属性 [ Entity Framework Core ] [ OnModelCreating ] 之间的调用不明确【英文标题】:The call is ambiguous between the following methods or properties [ Entity Framework Core ] [ OnModelCreating ] 【发布时间】:2021-06-07 16:17:33 【问题描述】:

我使用 EF Core,在我的 dbcontext 类中,我重写了 onModelCreating 方法以将类中的一个属性配置为在 SQL Server 中自动递增。

这是我的DbContext 班级:

public class AppDbContext:IdentityDbContext<AppUser>

    public AppDbContext(DbContextOptions options) : base(options)
    
    

    public AppDbContext()
    
    

    protected override void OnModelCreating(ModelBuilder builder)
    
        base.OnModelCreating(builder);

        builder.Entity<Service>()
               .Property(service => service.ID)
               .UseIdentityColumn(1, 1);
     

    public virtual DbSet<AppUser> AppUsers  get; set; 
    public virtual DbSet<Service> Services  get; set; 

如果您注意到我的 DbContext 类是从 IdentityDbContext 继承的,因为我使用了身份。

问题:我收到此错误:

CS0121 以下方法或属性之间的调用不明确:“Microsoft.EntityFrameworkCore.OraclePropertyBuilderExtensions.UseIdentityColumn(Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder, int, int)”和“Microsoft.EntityFrameworkCore.SqlServerPropertyBuilderExtensions.UseIdentityColumn(Microsoft.EntityFrameworkCore.Metadata .Builders.PropertyBuilder, int, int)'

Error Screenshot 1

Error Screenshot 2

其他信息

我在我的解决方案中引用了另一个项目,这个项目将扮演存储库的角色,并且他准备使用 SQL Server、Oracle 和 mysql

我依赖的项目是我自己的项目,开源的that is the repository link

请帮忙解决这个问题?

【问题讨论】:

不知道为什么这个问题被否决了。显然这不是 OP 代码的缺陷,而是 EF Core 设计的缺陷。只要您添加对具体数据库提供程序的引用,它们就会使用通用命名空间和扩展方法。最初,该指南曾经是提供者为其自己的特定扩展方法加上其名称的前缀,例如ForSqlServerXyzForMySqlXyzForOracleXyz 等,这很好。然后他们决定删除前缀并使用通用名称,这就是结果。人们真的应该去他们的 GitHub 报告/抱怨这些事情。 【参考方案1】:

我猜你不能只删除两个有问题的使用之一。 由于这些方法是扩展方法(所以是静态方法),您可以将它们用作静态方法:

Microsoft.EntityFrameworkCore.OraclePropertyBuilderExtensions.UseIdentityColumn(builder.Entity<Service>().Property(service => service.ID), 1, 1);

或者使用静态导入:

using static Microsoft.EntityFrameworkCore.OraclePropertyBuilderExtensions;

然后

UseIdentityColumn(builder.Entity<Service>().Property(service => service.ID), 1, 1)

我知道它不如流畅的书写方式漂亮,但如果您需要全部使用,我认为没有其他选择。

(我以为你想保留 Oracle 的)

【讨论】:

目前,我使用 SQL Server,但您的回答是帮助并使用 SQL Server 或 Oracle,非常感谢兄弟 不客气 :-) 但是你需要在同一个文件中使用 SQL Server 和 Oracle 吗? 将来我可能会需要它,但我已经创建了自己的跨 RDBMS 通用存储库项目 @DEV 不要在同一个文件中同时使用它们。如果您必须在代码中同时引用它们而不知道在任何给定时间使用哪个,请使用一个接口和两个单独的文件。尝试在同一个文件中同时使用两者只会使此类问题变得更加普遍和更糟(尽管老实说,这都在 EF 上)

以上是关于以下方法或属性 [ Entity Framework Core ] [ OnModelCreating ] 之间的调用不明确的主要内容,如果未能解决你的问题,请参考以下文章

使用 Entity Framework 4 和 Linq 查询比较 DateTime 属性中的日期的简单方法

在 MikroORM 中创建迁移时,如何解决“请在 EntityName.id 中提供 'type' 或 'entity' 属性”错误?

配置属性—Entity Framework 对应表字段的类型的设定配置方法

C#,Winform绑定实体框架(Entity Framework)的实体,如何去掉或隐藏导航属性?

从 Entity Framework Core 的导航属性中选择对象列表

Entity-Bean (JPA) 中的单向关系