[英]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类
ConfigurationCollection
和OptionValues
,它们具有多对多关系。 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.