【发布时间】: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