【问题标题】:Entity Framework 5, MVC 4, Code First - Persisting a List<string> in a classEntity Framework 5, MVC 4, Code First - 在一个类中持久化一个 List<string>
【发布时间】:2013-05-15 14:13:56
【问题描述】:

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

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

asp.net MVC 4, tagging places - best practice (eg Pub, Store, Restaurant)

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; }
   }

【问题讨论】:

  • 您需要在此处提供更多上下文。
  • 根据您的描述,您至少应该显示您的Place 类的代码,因为它听起来应该有标签的集合。这是你的意图吗?

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 asp.net-4.5


【解决方案1】:

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

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 表的外键。

【讨论】:

  • 这个解决方案可能比在一个字段中填充所有标签更容易查询许多场景。
  • 因为它是多对多的,所以我已将 ICollection 标签 {get;set;} 添加到 Places,并将 ICollection Places {get;set;} 添加到标签。
  • @niico,您使用 ICollection 可能是明智的,并且可能是比 List 更好的选择,这样您就不会为实现编码。见:stackoverflow.com/questions/7655845/…
【解决方案2】:

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

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

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

回到你刚刚做的列表;

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

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

【讨论】:

  • 谢谢 - 所以它看起来像是在逗号分隔的字符串之间 - 或单独的标签表。你会推荐哪个?
  • @user2254951 这取决于标签的性质。如果有任意限制或期望位置标签列表永远不会总是很短,我会将其作为 csl 保留在位置表中。另一方面,如果它是无限的,那么有必要将它放在它自己的桌子上,这样标签就不会受到 nvarchar(max) 的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多