我有一个使用SQL Server,Dapper.net的ASP.NET MVC 5站点。它有这些模型。
我有一个Listing类:
public int Id { get; set; }
public short ListingTypeId { get; set; }
public DateTime DateStart { get; set; }
public DateTime DateEnd { get; set; }
public string Details { get; set; }
和一个ListingType类:
public short Id { get; set; }
public string ListingTypeName { get; set; }
有20种商品类型 - 这个数字可能会随着时间而变化。
我们假设我们添加了一部电影"上市类型。我想说,所有列表都包含了ListTypeName =" Movie" - 在易于阅读的代码中,并不仅仅需要一种新的方法。
如果我们假设电影的ListingType Id = 21 - 基本上我试图像这样执行SQL:
Select * From Listing Where ListingTypeID = 21
然而,这是非常无意义的 - 即使我们将它包装在存储库中的SelectMovies方法中 - " 21"是没有意义的。
我可以选择列表中的每一行 - 并使用LINQ来删除电影 - 但是,表格可能非常大,而且这不会有效。
我可以使用Enums同步到数据库中的ListingType ID - 这将非常容易阅读 - 例如:
var MovieListings = myRepo.Select(myEnum.Movie);
但一般来说,将这些项目用于可变项目列表并不是一个好主意,因为它们会在数据库中失去同步和重复数据。我不想这样做。
是否有可能以具有语义易读代码的方式创建它,而无需使用枚举或硬编码数据库ID&使用最佳实践?
答案 0 :(得分:0)
是的,这是可能的。
我认为你应该在数据库中的ListingTypeName
列添加唯一性约束,因此ListingType
的名称不能重复。甚至可能用文本ID替换数字Id,如果它不会对表现造成太大的伤害(如果你只有20条记录就应该很好)。
在你的问题中你提到了存储库,我认为它们是一件非常好的事情。事实上,他们甚至可以在你的情况下做得很完美!只需将一个方法添加到存储库即FindListingByTypeName(string name)
,它将在内部使用其名称查找ListingType
,然后使用其ID来检索列表。
顺便说一句,如果你必须对Select * From Listing Where ListingTypeID = 21
这样的东西进行硬编码,你会遇到很大的设计问题。这应该来自您要向其显示TypeNames的用户界面,然后映射到Type id。