【问题标题】:Insert a List<String> to a ntext field using Linq to sql使用 Linq to sql 将 List<String> 插入到 ntext 字段中
【发布时间】:2016-03-31 08:20:50
【问题描述】:

我有这门课:

public class Course
{
    public String Name { set; get; }
    public int Code { set; get; }
    public List<String> PreRequireCources = new List<String>();
}

PreRequireCources 列表被这样的列表框填充:

Course cu = new Course();
cu.Name = txtName.Text;
cu.Code = Convert.ToInt32(txtCode.Text);
cu.PreRequireCources= lstPreRequirsist.Items
    .Cast<string>().ToList();

这是我的课程表:

如果我这样做,我会收到错误,因为 PreRequireCourcesList,但数据库列是 ntext

var db = new LinqDataContext();
db.Cources.InsertOnSubmit(cc);

那么我怎样才能将这个列表保存到我的数据库中呢?有没有更好的方法将此列表保存到每个学生的数据库中?
谢谢。

【问题讨论】:

  • 您必须为 PreRequireCources 创建一个单独的表,它可能有 3 列 Id、PreRequireCourceString 和 CourseCode
  • 提示:切勿将多值项存储在单个字段中。以后维护是一场噩梦。最好使用第二个表RequiredCourse,它有两个外键:一个 FK 指向有必修课的课程,另一个 FK 指向必修课。

标签: c# database linq list


【解决方案1】:

您正在尝试将值列表插入到需要单个文本值的列中。所以你可以将列表中的所有字符串连接成一个字符串

 cu.PreRequireCources= String.join(", ",lstPreRequirsist.Items
.Cast<string>().ToList());

用你的分隔符替换“,”。

【讨论】:

    【解决方案2】:

    有两种选择:

    1。将字符串连接成一个字符串(不太好)

    您可以将您的 Course 类更改为:

    public class Course
    {
        public String Name { set; get; }
        public int Code { set; get; }
        public String PreRequireCources = string.Empty;
    }
    

    并像这样从列表框中填充它:

    cu.PreRequireCources = string.Join(",", lstPreRequirsist.Items.
                                 Cast<string>());
    

    这样,您可以将课程作为, 分隔列表存储在PreRequire 列中。

    注意,这不是存储此类数据的好方法。 CoursePreRequireCources 之间似乎存在 mxn 关系,所以...

    2。创建交叉表来定义mxn关系

    解决这个问题的更好方法是创建一个名为PreRequiredCoursesToCourses 的表。假设您有这些课程

    Code    Name        PreRequireCourses
    1       Course1     Course2, Course3
    2       Course2     Course3
    3       Course3
    

    然后从该表中删除 PreRequireCourses 并构建一个交叉表:

    CourseCode    PreRequiredCode
    =============================
    1             2
    1             3
    2             3
    

    这使您的数据设计更加高效和灵活。存储必须再次解析才能确定需要哪些课程的字符串并不是一个好主意。

    如果您想稍后索取信息,您现在可以使用JOIN 获取课程预先要求的所有课程。

    【讨论】:

      【解决方案3】:

      您可以将您的 List 作为未映射的属性,并让另一个 string 列被映射。

      然后你可以序列化你的列表,例如,使用Newtonsoft.Json

      public class Course
      {
         public String Name { set; get; }
         public int Code { set; get; }
         // Mapped to column "PreRequire"
         public String PreRequire {
            get {
               return JsonConvert.SerializeObject(PreRequireCources);
            }
            set {
               PreRequireCources = JsonConvert.DeserializeObject<List<string>>(value);
            }
         }
         // Not mapped to any column
         public List<String> PreRequireCources = new List<String>();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 2012-05-15
        相关资源
        最近更新 更多