asp.net MVC 4,标记地点 – 最佳实践(例如酒吧,商店,餐厅)

ASP.NET MVC 4 Web应用程序,EF 5,SQL Server 2012 Express,Visual Web Developer 2012 Express,Code First

我有一个place对象 – 我想为每个地方添加多个标签。

最好的方法是逗号分隔的字符串或相关对象吗?

任何设计模式或方法来管理整个事物(添加,查找,与地点相关联等)? 良好的表现也是有意义的。

标记由管理员完成,因此以易于使用为代价的速度/易于实现是可以接受的。

谢谢。

首先,我认为你不需要一个对象来表示一个标签 – 假设标签只是一个字符串。

你应该做的是向你的实体添加一个字符串的generics列表属性,如下所示:

public IList Tags { get; set; } 

entity framework将处理它就好了。

关于UI部分,不要太费心,这些天一切都已经为你实现了,使用jQuery Tag-It: http : //aehlke.github.io/tag-it/

更新

因为EntityFramework给字符串映射列表带来了困难,所以只需为它创建一个简单的类:

 public class Tag { public string Name { get; set; } } 

并使用

 public IList Tags { get; set; } 

同样,如果不是因为EF的限制(或者如果你使用nhibernate),我仍然建议映射到字符串列表以避免复杂性(假设速度不是关键)

你可以真正处理它; 这取决于你想要什么以及你想要完成什么。 作为逗号分隔的字符串或IList ,它至少可以搜索,但不会比这更多。 您也很难对标签进行任何标准化(即不同的地方可能有“中式自助餐”,“中式”,“中式自助餐”,“中式自助餐”等)。

最强大的方法是与Place具有M2M关系的实际Tag实体。 有了这个,您可以通过使名称成为一个独特的列,并执行先发制人的重复数据删除查询(即使用条目:“中文”,“您的意思是’中文’?”等)来获得相当程度的规范化。

拥有Tag实体还可以让您轻松地执行自动填充查询,因为您可以在一个地方查找以特定字符开头的所有标签或标签。 以逗号分隔的字符串几乎不可能实现它,因为它需要首先聚合所有这些字符串(以及跨所有不同类型的对象),然后在最终返回列表之前解析出唯一标记。

UPDATE

我不知道任何与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 Tags } 

这里唯一困难的部分是,为了使EF将关系识别为M2M,关系的两侧都需要具有指向另一方的导航属性。 你有两个选择:

  1. 继续向双方添加导航属性。 所以,在Tag你会添加以下行:

     public virtual ICollection Places 

    这没有什么“错误”,如果您希望能够轻松查找特定标签的位置,实际上可能需要它。 但是,您仍然可以在没有导航属性的情况下获取该信息,即:

     db.Places.Where(m => m.Tags.Contains(someTag)) 
  2. 使用EntityTypeConfiguration明确告诉EF这是一个M2M。 我通常遵循的模式是在我的实体中创建一个“Mapping”类:

     public class Place { ... public class PlaceMapping : EntityTypeConfiguration { 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 } 

    这只是我遵循的用于保持组织的模式,只要您可以从DbContext引用它,就可以将EntityTypeConfiguration放在任何您喜欢的位置。