【发布时间】:2020-02-25 23:43:51
【问题描述】:
如何获得强类型的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 自动递增)?
我在TypeConifiguration 中尝试了ValueGeneratedOnAdd(),但没有成功...
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 增量。这有可能吗?
【问题讨论】:
-
为什么你认为你仍然需要
FileUploadId类?如果它所做的只是公开一个只读 int 属性,为什么不在FileUpload类上使用一个只读 int 属性呢?FileUploadId有什么好处? -
这是关于“原始痴迷”的。你可以在这里阅读:andrewlock.net/…
-
谢谢,因为你,我今天学到了一些新东西!然而,我确实认为,虽然博客文章中提出的观点是有效的,并且提出的解决方案也是有效的,但这种方法在许多情况下可能是一种巨大的矫枉过正。
-
是的,我完全同意。在大多数情况下,这种方法是矫枉过正的。但是,当您从头开始一个包含大型业务领域的新项目时,它可能对干净的代码库非常有帮助。
-
所以想法是在自定义类中包含一些原始值,例如主键和外键,因此类匹配可以询问您“为什么要尝试将 CustomerID 分配给 OrderID 字段/属性?”有趣的想法。可以适当地为它制作一个通用的。
标签: c# sql-server .net-core entity-framework-core domain-driven-design