有条件地保存辅助表对象

Posted

技术标签:

【中文标题】有条件地保存辅助表对象【英文标题】:Conditionally save secondary table objects 【发布时间】:2014-06-30 05:51:32 【问题描述】:

我在我的 ASP MVC 3 站点中使用实体框架来处理一对多关系。主表 (AgentTransmission) 模型对象包含一个 List 的辅助表对象 (ClearninghouseParnters)。感谢 EF,我只需保存 AgentTransmission 对象以供 ClearinghousePartnersFK 字段填充和保存。

但是,用户获得的表单有五个字段用于输入信息交换所信息,如下所示。

每一行代表一个新的ClearinghousePartners 列表项对象。不幸的是,每个对象都被保存到数据库中,无论它是否包含数据。这在性能方面甚至在页面的显示方式上都没有真正的区别,但是它会使表格变得非常混乱。

我的问题是:如果ClearinghouseNameTradingPartnersNameStartDate 列中存在值,是否有办法指示实体框架仅将项目保存在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()。谢谢

以上是关于有条件地保存辅助表对象的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Alchemy ORM 中使用辅助连接

Sqlite联合注入辅助脚本

技术分享Sqlite联合注入辅助脚本

C++啥情况下使用PYTHON辅助

ios:使用核心数据同时保存/更新多条记录

SQLAlchemy,自引用辅助表关联