简体   繁体   English

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

[英]Simple approach for Adding object in a many to many relationship

I have 2 classes ConfigurationCollection and OptionValues which has a many to many relationship. 我有2类ConfigurationCollectionOptionValues ,它们具有多对多关系。 I have tried solutions on the net to get it working. 我已经在网上尝试了解决方案以使其正常运行。 I tried adding another class to create two one to many relationship. 我尝试添加另一个类来创建两个一对多的关系。 But I am not understanding it the right way I suppose. 但是我不以我认为的正确方式理解它。 And I also tried it without adding a third class. 而且我也尝试了它,而没有增加第三类。

Model classes 模型类

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

Controller 控制者

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

I am not sure what should be written in the Controller. 我不确定应该在控制器中写些什么。 I am able to populate the OptionValues in my View. 我可以在视图中填充OptionValues I am just missing something that could save the data into the database. 我只是缺少一些可以将数据保存到数据库中的东西。

UPDATE : Create Post Action Method 更新:创建后期操作方法

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

Update : View 更新:查看

@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" />
}

In your case, the third table is not mandatory. 在您的情况下,第三张表不是必需的。

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

The EF will recognize the nm relationship. EF将识别nm关系。

In the Create method, you are sending a ConfigurationCollection object to the Controller, right? 在Create方法中,您正在将ConfigurationCollection对象发送到Controller,对吗? So, you just have to insert the object into the DbSet . 因此,您只需要将对象插入DbSet Like this: 像这样:

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

EDIT 编辑

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

View: 视图:

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

Models: 楷模:

If you are using the 'third class', modify your classes as follows: 如果您使用的是“第三类”,请按如下所示修改您的类:

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

}

If you are not using the 'third class': 如果您不使用“三等舱”:

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

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM