EF Core,禁用外键列名生成
Posted
技术标签:
【中文标题】EF Core,禁用外键列名生成【英文标题】:EF Core, disable foreign key column name generation 【发布时间】:2021-11-07 05:38:32 【问题描述】:我有一个如下表/C# 类;
书籍(C# class= MyStoreBook)
Id
Title
Tags
BookTags(C# class= MyStoreBookTag)
Id
BookId (Foreign Key)
Name
当我通过 EF Core 运行以下查询时:
FromSqlRaw('select * from BookTags where bookid = @bookid')
我遇到了一个错误
“FromSql”操作的结果中不存在所需的列“MyStoreBookId”。
但我不希望 EF 生成 FK 导航属性名称,我只希望它与列名进行直接数据绑定。
有没有办法禁用这种行为?
【问题讨论】:
导航属性和 FK 属性是不同的东西。 FK 属性像任何其他原始数据属性一样映射到真实的数据库表列,因此不能“禁用”。您只是有不正确的映射(请记住 EF Core 是 ORMapper),导致 EF Core 认为该表包含列“MyStoreBookId”而不是实际的“BookId”。这是您需要解决的实际问题。如何做到这一点取决于您的模型类MyStoreBookTag
的外观。由于您没有将其包含在帖子中,因此我们无法给您具体的答案/提示。
如果你从 db 搭建你的 c# 类,它会成功的.. ;)
@IvanStoev C# 类具有与表相同的属性名称。我想实现 1-1 映射,但 EF Core 期望 select 语句具有我不想要的具体列名 MyStoreBookId
。该存储过程可能是从 DB 提供程序中使用的,我不想在其中包含生成的名称。
显然这些类没有与数据库表相同的属性(或者说不同,有额外的导航属性),否则 EF Core 不会期望名为“MyStoreBookId”的列。正如我在之前的评论中所说,您没有正确映射您的类及其关系。如果您想获得解决方案,请将您的 类 和相关的流畅配置(如果有)放在问题中。
谢谢@IvanStoev。你是对的,我对导航/外键绑定感到困惑。我在另一个问题中找到了类似的答案,并在下面发布了我的解决方案。
【参考方案1】:
我通过将ForeignKey
属性添加到Book
类来纠正问题。我借用了答案:The required column 'CustomerId' was not present in the results of a 'FromSql' operation
Book (C# class = MyStoreBook)
Id
[ForeignKey(nameof(BookTags))]
Tags
Title
【讨论】:
以上是关于EF Core,禁用外键列名生成的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:如何将自动生成的外键列名从小写更改为大写