有条件地保存辅助表对象
Posted
技术标签:
【中文标题】有条件地保存辅助表对象【英文标题】:Conditionally save secondary table objects 【发布时间】:2014-06-30 05:51:32 【问题描述】:我在我的 ASP MVC 3 站点中使用实体框架来处理一对多关系。主表 (AgentTransmission
) 模型对象包含一个 List
的辅助表对象 (ClearninghouseParnters
)。感谢 EF,我只需保存 AgentTransmission
对象以供 ClearinghousePartners
的 FK
字段填充和保存。
但是,用户获得的表单有五个字段用于输入信息交换所信息,如下所示。
每一行代表一个新的ClearinghousePartners
列表项对象。不幸的是,每个对象都被保存到数据库中,无论它是否包含数据。这在性能方面甚至在页面的显示方式上都没有真正的区别,但是它会使表格变得非常混乱。
我的问题是:如果ClearinghouseName
、TradingPartnersName
或StartDate
列中存在值,是否有办法指示实体框架仅将项目保存在ClearinghousePartners
列表对象中?
同样,如果我们发现有一个项目回发到控制器,并且具有现有的ClearinghousePartners
PK 并且在相同的字段中没有值/空白,我想从表中删除对象。
主表模型
仅供参考 - 此表包含大量字段,因此我只显示 List
public partial class AgentTransmission
.
.
public virtual List<ClearinghousePartners> ClearinghousePartners get; set;
辅助表模型
public partial class ClearinghousePartners
public int Id get; set;
public string ClearingHouseName get; set;
public string TradingPartnerName get; set;
public Nullable<System.DateTime> StartDate get; set;
public int AgtTransId get; set; //FK field corresponds to 'Id' on AgentTransmission
public virtual AgentTransmission AgentTransmission get; set;
控制器
agenttransmission.LastChangeDate = DateTime.Now;
agenttransmission.LastChangeOperator = Security.GetUserName(User);
db.AgentTransmission.Add(agenttransmission);
db.SaveChanges(); //Saves to both tables
查看
<fieldset id="ClearinghousePartners">
<legend>Clearinghouse Partners</legend>
<center>
<table>
<thead>
<th>Clearinghouse Name</th>
<th>Trading Partner Name</th>
<th>Start Date</th>
</thead>
<tbody>
@for (int i = 0; i < Model.ClearinghousePartners.Count(); i++)
<tr align="center">
@html.HiddenFor(model => model.ClearinghousePartners[i].Id)
@Html.HiddenFor(model => model.ClearinghousePartners[i].AgtTransId)
<td>@Html.TextBoxFor(model => model.ClearinghousePartners[i].ClearingHouseName, new style = "width: 100px" )</td>
<td>@Html.TextBoxFor(model => model.ClearinghousePartners[i].TradingPartnerName, new style = "width: 100px" )</td>
<td>@Html.TextBoxFor(model => model.ClearinghousePartners[i].StartDate, new style = "width: 100px" )</td>
</tr>
</tbody>
</table>
</center>
</fieldset>
【问题讨论】:
【参考方案1】:最简单的方法是制定一些条件,将对象限定为“非空”,即用户为它输入了一些内容,因此应该保存它。然后,从 POST 的列表中删除所有“null”的项目。
agenttransmission.ClearingHousePartners
.Where(m => string.IsNullOrWhitespace(m.ClearingHouseName))
.Remove();
如果发布的名称值是空的,这将从列表中删除任何项目。如果您想要附加限定条件来确定不应保存对象,只需将它们作为附加子句添加到 Where
中即可。
【讨论】:
好主意,谢谢。但是,我不得不使用.RemoveAll()
并将谓词放在那个方法中,因为VS 在.Where()
之后无法识别.Remove()
。谢谢以上是关于有条件地保存辅助表对象的主要内容,如果未能解决你的问题,请参考以下文章