【问题标题】:RepoDb does not seem to work for SQL Server tables with dot in the nameRepoDb 似乎不适用于名称中带有点的 SQL Server 表
【发布时间】:2020-07-28 09:02:36
【问题描述】:

我开始使用 RepoDb,但我的 SQL Server 2016 数据库的表格中间有一个点,如下所示:User.Data

从完整的 .NET 实体框架迁移到 RepoDb,我正面临这个问题。我正在使用流利的映射,我写了这样的东西:

FluentMapper
    .Entity<UserData>()
    .Table("[User.Data]")
    .Primary(u => u.UserId)

我得到了例外:MissingFieldsException 它说:

找不到表“[User.Data]”的数据库字段。确保目标表“[User.Data]”存在于数据库中和/或至少有一个字段可用。

出于好奇,我创建了一个具有相同属性和主键的表UserData,效果很好(更改流利的映射器:.Table("[UserData]")

我错过了什么吗?

谢谢你帮助我

【问题讨论】:

  • 您确定这是一个名为 User.Data 的表,而不是架构 User 中名为 Data 的表吗?无论哪种方式,使用对象名称中带有. 的表是一个非常令人困惑和糟糕的主意,就像使用保留关键字的名称一样(USER 是保留关键字,如果对象位于名为User)。您应该尽量使用不需要定界标识的对象名称。就个人而言,如果您没有进入开发周期太远,您可以重命名该对象/模式。
  • 如果您遇到架构问题,您可能不应该更改 ORM。 EF Core 没有损坏,并且一些 RepoDB 的功能通常不需要在 ORM 中,它们确实是高级概念。例如,EF Core 的 DbSet 已经实现了存储库模式,而 DbContext is 是一个工作单元。 RepoDB 的批量插入将对象包装在 IDbDataReader 中并使用 SqlBulkCopy。这不是 ORM 中需要的东西,它是 ETL 和普通的 ADO.NET。
  • 也没有真正的“批量”更新或删除,RepoDB 将数据存储在临时表中并与目标表执行 MERGE。再一次,那是 ADO.NET,没有真正涉及任何对象。您确定需要这些功能吗?
  • 您好罗伯托,感谢您的提问。不幸的是,RepoDb 不会解析带有 '.' 的表。以其名义。尽管名称选择与模式分隔符不太可能一致,但仍然是一个有效的实际用例。简而言之,我们认为它是一个错误。请允许我们在部署新的 beta 版本后回复您。但我同意 Larnu 的评论,只是避免命名可能引发与保留关键字等冲突的表。
  • 感谢大家的回答。不幸的是,我的示例中没有引用模式名称。我知道这种命名约定是一个糟糕的选择,但当时我并不知道数据库名称的最佳实践。现在我必须处理它并尝试在未来改变,但现在这是不可能的。谢谢,迈克尔了解情况。我会等待测试版。

标签: sql-server micro-orm


【解决方案1】:

对此的支持仅在RepoDb.SqlServer (v1.0.13) 或更高版本中可用。您可以使用以下任一方法。如果您使用数据库和架构,请务必指定引号。

通过内置的MapAttribute

[Map("[User.Data]")]

通过System.ComponentModel.DataAnnotations 命名空间的TableAttribute

[Table("[User.Data]")]

和你一样通过FluentMapper

FluentMapper
    .Entity<UserData>()
    .Table("[User.Data]");

【讨论】:

  • 完美运行。我使用了 FluentMapper。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 2021-06-03
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2013-08-11
相关资源
最近更新 更多