在多对多关系中添加对象的简单方法

时间:2015-11-05 09:31:21

标签: c# asp.net-mvc entity-framework asp.net-mvc-5 many-to-many

我有两个类ConfigurationCollectionOptionValues,它们有很多关系。我在网上尝试过解决方案让它运转起来。我尝试添加另一个类来创建两个一对多的关系。但我不是以正确的方式理解它。而且我也尝试了它而没有添加第三类。

模型类

public class ConfigurationCollection
{
    public int ConfigurationCollectionID { get; set; }
    public string CollectionName { get; set; }
    public int LsystemID { get; set; }

    public virtual Lsystem Lsystem { get; set; }
    public virtual ICollection<OptionValue> OptionValues { get; set; }
}
public class OptionValue
{
    public int OptionValueID { get; set; }
    public string OptionVal { get; set; }
    public int OptionID { get; set; }

    public virtual ICollection<ConfigurationCollection> ConfigurationCollections { get; set; }
    public virtual Option Option { get; set; }
}
public class Config_OptionVal
{
    public int Config_OptionValID { get; set; }
    public int OptionValueID { get; set; }
    public int ConfigurationCollectionID { get; set; }
    public bool OptionValChecked { get; set; }

    public virtual OptionValue OptionValue { get; set; }
    public virtual ConfigurationCollection ConfigurationCollection { get; set; }
}

控制器

 public ActionResult Create(int LsystemID)
 {
     var model = new ConfigurationCollection
     {
       LsystemID = LsystemID,
       Lsystem = db.Lsystem.FirstOrDefault(x => x.LsystemID == LsystemID),
       OptionValues=new List<OptionValue>()
     };
     return View(model);
 }

我不确定控制器中应该写什么。我可以在我的视图中填充OptionValues。我只是遗漏了一些可以将数据保存到数据库中的东西。

更新:创建后期操作方法

public ActionResult Create(ConfigurationCollection con)
{
    foreach(var item in con.OptionValues)
    {
         if(item.OptionValueChecked)
            db.Config_OptionVal.Add(item);
    }
    db.ConfigurationCollection.Add(con);
    db.SaveChanges();
}

更新:查看

@using (Html.BeginForm()) 
{
   @Html.AntiForgeryToken()
   @Html.LabelFor(model => model.CollectionName, htmlAttributes: new { @class = "control-label col-md-2" })
   @Html.EditorFor(model => model.CollectionName, new { htmlAttributes = new { @class = "form-control" } })

    <table class="table">
    <tr style="column-width:20px">
         <th>Option</th>
         <th>Option value</th>
    </tr>
    @foreach (var item in Model.Lsystem.Options)
    {
       <tr>
       <td><b>@item.OptionName</b></td>
       <td>                        
       @foreach (var ov in item.OptionValues)
       {                        
         <input type="checkbox"  id="OptionValues"/>@ov.OptionVal
       }
       </td>
       </tr>
     }
     </table>
     <input type="submit" value="Create" class="btn btn-default" />
}

1 个答案:

答案 0 :(得分:1)

在您的情况下,第三个表不是强制性的。

public class ConfigurationCollection
{
    public int ConfigurationCollectionID { get; set; }
    public string CollectionName { get; set; }

    public virtual ICollection<OptionValue> OptionValues { get; set; }
}
public class OptionValue
{
    public int OptionValueID { get; set; }
    public string OptionVal { get; set; }

    public virtual ICollection<ConfigurationCollection> ConfigurationCollections { get; set; }
}

EF将识别n-m关系。

在Create方法中,您正在向Controller发送ConfigurationCollection对象,对吧?因此,您只需将对象插入DbSet即可。像这样:

public ActionResult Create(ConfigurationCollection con)
{
    db.ConfigurationCollection.Add(con);
    //all of the OptionValues inside the 'con' object will be automatically inserted
    db.SaveChanges();
}

修改

public ActionResult Create(ConfigurationCollection con, int[] optionsValuesIds)
{
    db.ConfigurationCollection.Add(con);
    foreach (optionValueId in optionsValuesIds) 
    {
       //if you are using the 'third class'
       Config_OptionVal cnfOpt = new Config_OptionVal();
       cnfOpt.ConfigurationCollection = con;
       cnfOpt.OptionValueID = optionValueId;
       db.Config_OptionVal.Add(cnfOpt);

       //if you are NOT using the 'third class' 
       OptionValue optVal = db.OptionValues.Find(optionsValuesIds);
       con.OptionValues.Add(optVal);
    }
    db.SaveChanges();
}

查看:

<input type="checkbox" name="OptionValuesIds" value="@ov.OptionValueID"  id="OptionValues"/>@ov.OptionVal

型号:

如果您使用的是第三课&#39;,请按以下步骤修改课程:

public class ConfigurationCollection
{
    //...
    //public virtual ICollection<OptionValue> OptionValues { get; set; }
    public virtual ICollection<Config_OptionVal> OptionValues { get; set; }
}

public class OptionValue
{
   //...
   //public virtual ICollection<ConfigurationCollection> ConfigurationCollections { get; set; }
   public virtual ICollection<Config_OptionVal> ConfigurationCollections { get; set; }

}

如果您没有使用&#39;第三课&#39;:

public class ConfigurationCollection
{
    //...
    public virtual ICollection<OptionValue> OptionValues { get; set; }
}
public class OptionValue
{
    //...
    public virtual ICollection<ConfigurationCollection> ConfigurationCollections { get; set; }

}