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

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

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

有什么设计模式或管理整个事物的方法(添加、查找、与某个地方联系等(吗?良好的表现也令人感兴趣。

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

谢谢。

asp.net MVC 4,标记场所-最佳实践(如酒吧、商店、餐厅)

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

您应该做的是将字符串的通用列表属性添加到您的实体中,如下所示:

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,关系的双方都需要具有指向另一方的导航属性。你有两个选择:

  1. 继续并在两侧添加导航属性。因此,在Tag中,您将添加以下行:

    public virtual ICollection<Place> Places
    

    这并没有什么"错",事实上,如果你想轻松查找特定标签的位置,这可能是你想要的。然而,您仍然可以在没有导航属性的情况下获得该信息,即:

    db.Places.Where(m => m.Tags.Contains(someTag))
    
  2. 使用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引用它。