Chr*_*cke 2 ef-database-first entity-framework-core
我有一些 EF Core 模型,它们是使用dotnet ef dbContext scaffold数据库优先方法构建的,用于生成模型。我的问题是数据库使用整数主键,用于将表链接在一起,但有一个基于字符串的索引,可用作搜索表的合理索引。
但是:当我尝试使用时,FindAsync("abc000")我得到了一个完全预期的错误The key value at position 0 of the call to 'DbSet<Entity>.Find' was of type 'string', which does not match the property type of 'long'.
所以,两个问题:
它们看起来像这样:
class Entity
{
long Id;
string Key;
};
Run Code Online (Sandbox Code Playgroud)
在 OnModelCreating 中:
modelBuilder.Entity<Entity>(entity =>
{
entity.ToTable("tb_entity", "main");
entity.HasIndex(e => e.Key)
.HasName("uq_entity_key")
.IsUnique();
entity.Property(e => e.Id).HasColumnName("_id");
entity.Property(e => e.Key)
.HasColumnName("key")
.HasMaxLength(255);
}
Run Code Online (Sandbox Code Playgroud)
创建表的 SQL 如下所示:
CREATE TABLE [tb_entity]
(
_id BIGINT PRIMARY KEY IDENTITY(1,1),
key NVARCHAR(255) CONSTRAINT uq_entity_key UNIQUE NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)
- EF 如何找出主键是什么?
如果未通过[Key]属性或HasKeyfluent API明确指定,则按照约定:
按照惯例,名为
Id或的属性<type name>Id将被配置为实体的键。
您可以通过检查来查看该信息
var pk = context.Model.FindEntityType(typeof(Entity)).FindPrimaryKey();
Run Code Online (Sandbox Code Playgroud)
- 有什么办法可以重新调整它,以便我可以使用“查找”按名称搜索实体,但保留自动增量主键?
您可以使用数据标注/流利的API,它的的PK说谎EF核心Entity是Name,但我不建议,因为这将导致对FK关系的错误的假设,一般是坏的。
相反,不要使用专用于 PK 的Find/FindAsync方法。First、FirstOrDefault、Single和 SingleOrDefault(以及它们的Async对应项)允许您按任何条件进行搜索,例如,FindAsync("abc000")您可以使用FirstOrDefaultAsync(e => e.Name == "abc000").
唯一的区别是Find方法首先在本地缓存中搜索,这在大多数使用场景中并没有太大的好处。另一方面,Find方法不支持预先加载,而后者支持。后者是针对数据库执行的,并且由于该列上有一个唯一索引,因此它们应该具有足够的性能。
- 我是否因为更喜欢自动递增整数键作为连接表的字段而愚蠢?
这是非常标准的数据库设计,通常比自然 PK 更可取,我认为这没有任何问题。
| 归档时间: |
|
| 查看次数: |
2112 次 |
| 最近记录: |