我是EF Core的新手。我的网络应用程序的某些型号将显示为下拉控件的列表项。
我按如下方法创建一个接口和一个模型。
public interface ISelectListItemable
{
int Id { get; set; }
string Name { get; set; }
}
public class Tag : ISelectListItemable
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
}
因此我可以创建
public static class IEnumerableExtension
{
public static IEnumerable<SelectListItem> ToSelectListItem<T>(this IEnumerable<ISelectListItemable> items, int selectedValue)
{
return from item in items
select new SelectListItem
{
Text = item.Name,
Value = item.Id.ToString(),
Selected = item.Id.Equals(selectedValue)
};
}
}
轻松获得SelectListItem
列表。
据我所知,我没有看到任何有关实现接口的模型的教程。所以我的问题是我上面的代码有什么弊端吗?
答案 0 :(得分:2)
这取决于您使用的是什么(或多少)体系结构。
名称ISelectListItemable
表示与UI有关。我认为这对于ViewModel而不是Model是可行的。
当您直接在视图中使用模型时,可以这样做,但这会降低设计的可伸缩性和灵活性。
基本上,它与将[DisplayName()]
放在模型属性中处于同一个联盟。有人这样做,但仅限于较小的项目。
关于EF Core中的映射,
我注意到,应用于接口属性的任何数据注释属性都不会影响生成的模式。
正确无误,这是设计使然,也是唯一可行的方法。
与基本类相比,它使接口更具侵入性。 EF可能永远都看不到该界面。因此,当您使用这样的东西时,它比继承要好得多。