0

我的解决方案应该适用于:ASP.NET MVC 4、EF5、Code First、Visual Studio 2012 Express、SQL Server 2012 Express。

我需要用一个地方对象存储许多标签。在另一个问题中,有人建议我使用 List 来实现这一点:

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

IE

public List<String> Tags {get;set;}

如果我只是补充一点,它根本不会保存在数据库中。我怎样才能让它坚持下去?

谢谢。

更新

这需要多对多的关系——例如,一个地方可能被标记为咖啡馆和自行车店。有许多咖啡馆和自行车商店。

   public class Place
   {
      public Place()
      {
         // Set default value of dateAdded to now
         DateAdded = DateTime.Now;
      }

      [ScaffoldColumn(false)]
      public virtual int PlaceID { get; set; }

      public virtual List<Tag> Tags { get; set; }

      [ScaffoldColumn(false)]
      [DisplayName("Date Added")]
      public virtual DateTime DateAdded { get; set; }

      [Required(ErrorMessage = "Place Name is required")]
      [StringLength(100)]
      public virtual string Name { get; set; }
      public virtual string URL { get; set; }

      [DisplayName("Contact Name")]
      public virtual string ContactName { get; set; }
      public virtual string Address { get; set; }
      public virtual string City { get; set; }

      [DisplayName("Post Code")]
      public virtual string PostCode { get; set; }
      public virtual string Website { get; set; }
      public virtual string Phone { get; set; }

      [EmailAddress(ErrorMessage = "Please enter valid email")]
      public virtual string Email { get; set; }
      public virtual string About { get; set; }
      public virtual string Image { get; set; }
   }
4

2 回答 2

5

您希望标签如何在数据库中表示?EF 没有映射到 List 的本机 SQL Server 类型(更典型的映射是将表的行映射到对象列表),因此您必须进行一些操作。如果您希望它成为单个单元格(即一个字段),那么我会将其设置为数据库中的 nvarchar 和代码中的字符串。

然后我会保留该列表,因为它更容易在代码中处理,并使用以下 LINQ 查询将列表转换为逗号分隔的列表,该列表将是一个字符串,从那里它可以像任何其他字符串一样进入 nvarchar。

string csl = myList.Aggregate((c, n) => c + "," + n));

回到你刚刚做的列表;

List<string> = csl.Split(',').ToList();

无论您决定如何表示数据,都不会像向类中添加列表那么简单。您必须考虑什么对您的应用程序最有意义,这只是一个让您入门的想法,因为您的问题有点含糊,无法提供完整的解决方案。

于 2013-05-20T22:38:01.357 回答
3

正如 evanmcdonnal 所说,EF 无法将纯字符串列表映射到数据库。一个简单的解决方案是创建一个 Tag 实体:

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

然后在您的地方实体中,使用标签列表:

public List<Tag> Tags { get; set; }

//just a helper, not required
public void AddTag(string tagName)
{
    Tag tag = new Tag { Name = tagName };
    Tags.Add(tag);
}

结果将是数据库中的一个新标签表,其中包含返回到 Places 表的外键。

于 2013-05-20T23:00:00.613 回答