如何获取强类型ID ...
public sealed class FileUploadId
{
public int Value { get; }
public FileUploadId(int value)
{
Value = value;
}
}
...在我的FileUpload
类中使用的...
public class FileUpload : EntityBase, IAggregateRoot
{
private FileUpload() { /* Required by EF */ }
public FileUpload(string name, string relativePath, FileUploadType type, string contentType, long? size = null)
{
/* Guard clauses... */
Id = new FileUploadId(0);
/* Other properties... */
}
public FileUploadId Id { get; }
/* Other properties... */
}
...使用身份(int
自动递增)?
我在ValueGeneratedOnAdd()
中尝试了TypeConifiguration
,但没有成功...
public class FileUploadTypeConfig : IEntityTypeConfiguration<FileUpload>
{
public void Configure(EntityTypeBuilder<FileUpload> builder)
{
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).HasConversion(x => x.Value, x => new FileUploadId(x)).ValueGeneratedOnAdd();
/* Other configurations... */
}
}
我知道HiLo算法还有另一个选择。但是我想让它以默认的int
id增量工作。这有可能吗?
老实说,在EF中将强类型变量与SQL一起使用确实是一件很痛苦的事情。我见过的最好的解释可以在this blog post by Andrew Lock中找到。
问题的核心?使用强类型的值可能会导致在客户端上执行查询过滤(WHERE ID = value子句),这要求从数据库检索所有记录的过程才能在本地执行选择。
解决方案的核心?使用ValueConverter将强类型值转换为正确的SQL Server值。
细节广泛。有关如何执行的详细信息,请参见所引用的文章。
我建议不要让EF处理强类型ID。它不能很好地处理它,并且在某些情况下会尝试过滤内存中的内容。
但是您可以同时拥有两个属性,一个属性用于EF查询,另一个属性用于其他所有内容。
class FileUpload
{
public int InternalId { get; private set; }
public FileUploadId Id
{
get { return new FileUploadId(InternalId); }
set { InternalId = value.Value; }
}
}
它泄漏了,但是有效。