在多对多关系中添加对象的简单方法
Simple approach for Adding object in a many to many relationship
我有 2 个 classes ConfigurationCollection
和 OptionValues
,它们具有多对多关系。我已经尝试过网上的解决方案来让它工作。我尝试添加另一个 class 来创建两个一对多关系。但是我没有以我想的正确方式理解它。我也尝试过不添加第三个class。
型号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; }
}
控制器
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
。我只是缺少可以将数据保存到数据库中的东西。
更新:创建 Post 操作方法
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" />
}
在您的情况下,第三个 table 不是强制性的。
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
型号:
如果您使用的是 'third class',请按如下方式修改您的 类:
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; }
}
如果您没有使用 'third class':
public class ConfigurationCollection
{
//...
public virtual ICollection<OptionValue> OptionValues { get; set; }
}
public class OptionValue
{
//...
public virtual ICollection<ConfigurationCollection> ConfigurationCollections { get; set; }
}
我有 2 个 classes ConfigurationCollection
和 OptionValues
,它们具有多对多关系。我已经尝试过网上的解决方案来让它工作。我尝试添加另一个 class 来创建两个一对多关系。但是我没有以我想的正确方式理解它。我也尝试过不添加第三个class。
型号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; }
}
控制器
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
。我只是缺少可以将数据保存到数据库中的东西。
更新:创建 Post 操作方法
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" />
}
在您的情况下,第三个 table 不是强制性的。
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
型号:
如果您使用的是 'third class',请按如下方式修改您的 类:
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; }
}
如果您没有使用 'third class':
public class ConfigurationCollection
{
//...
public virtual ICollection<OptionValue> OptionValues { get; set; }
}
public class OptionValue
{
//...
public virtual ICollection<ConfigurationCollection> ConfigurationCollections { get; set; }
}