asp.net MVC 4,标记场所-最佳实践(如酒吧、商店、餐厅)
本文关键字:酒吧 餐厅 商店 最佳 MVC net asp | 更新日期: 2023-09-27 18:14:22
ASP。NET MVC 4 web应用程序、EF 5、SQL Server 2012学习版、Visual web Developer 2012学习版和Code First
我有一个地方对象-我想为每个地方添加多个标签。
最好的方法是逗号分隔的字符串还是相关对象?
有什么设计模式或管理整个事物的方法(添加、查找、与某个地方联系等(吗?良好的表现也令人感兴趣。
标记是由管理员完成的,因此以一点易用性为代价的实现速度/易用性是可以接受的。
谢谢。
首先,我认为不需要对象来表示标记——假设标记只是一个字符串。
您应该做的是将字符串的通用列表属性添加到您的实体中,如下所示:
public IList<string> Tags { get; set; }
实体框架会很好地处理它。
关于UI部分,不用太麻烦,现在一切都已经为您实现了,使用jQuery标记它:http://aehlke.github.io/tag-it/
更新
因为EntityFramework很难处理字符串的映射列表,所以只需为其创建一个简单的类:
public class Tag
{
public string Name { get; set; }
}
并使用
public IList<Tag> Tags { get; set; }
同样,如果不是因为EF的限制(或者如果您使用nhibernate(,我仍然建议映射到字符串列表,以避免复杂性(假设速度不是关键(
你真的可以用任何一种方式处理它;这取决于你想要什么,以及你想要完成什么。作为逗号分隔的字符串或IList<string>
,它至少是可搜索的,但仅此而已。你也很难对标签进行任何形式的规范化(即,不同的地方可能有"中式自助餐"、"中式"、"中国自助餐"、"中式自助餐"等(。
最稳健的方法将是与CCD_ 3具有M2M关系的实际CCD_。这样,您就可以通过使名称成为一个唯一的列,并执行先发制人的重复数据消除查询(即输入:"chinese"、"Do you mean‘chinese’?"等(来获得相当程度的规范化
拥有Tag
实体还可以让您轻松地进行自动完成查询,因为您将有一个地方可以查找所有标签或以某个字符开头的标签。逗号分隔的字符串几乎不可能实现这一点,因为它需要首先聚合所有这些字符串(以及所有不同类型的对象(,然后在最终返回列表之前解析出唯一的标记。
更新
我根本不知道有任何现有的MVC标签相关项目。谷歌应该能够帮助或只是在Visual Studio中的NuGet包管理器中搜索。
然而,这是非常简单的滚动自己。
public class Tag
{
public int TagId { get; set; }
public string Name { get; set; }
// If your tags will be more freeform (and not necessarily URL compatible)
public string Slug { get; set; }
}
public class Place
{
...
public virtual ICollection<Tag> Tags
}
这里唯一困难的部分是,为了让EF将关系识别为M2M,关系的双方都需要具有指向另一方的导航属性。你有两个选择:
继续并在两侧添加导航属性。因此,在
Tag
中,您将添加以下行:public virtual ICollection<Place> Places
这并没有什么"错",事实上,如果你想轻松查找特定标签的位置,这可能是你想要的。然而,您仍然可以在没有导航属性的情况下获得该信息,即:
db.Places.Where(m => m.Tags.Contains(someTag))
使用
EntityTypeConfiguration
明确告诉EF这是M2M。我通常遵循的模式是在我的实体中创建一个"映射"类:public class Place { ... public class PlaceMapping : EntityTypeConfiguration<Place> { public PlaceMapping() { HasMany(m => m.Tags).WithMany(); } } }
然后,在您的DbContext:中
public override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new Place.PlaceMapping()); // Any other configurations added here the same way }
这正是我所遵循的保持事情有序的模式,你可以把你的
EntityTypeConfiguration
放在任何你喜欢的地方,只要你可以从你的DbContext引用它。