【问题标题】: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>

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4.1


    【解决方案1】:

    最简单的方法是制定一些条件,将对象限定为“非空”,即用户为它输入了一些内容,因此应该保存它。然后,从 POST 的列表中删除所有“null”的项目。

    agenttransmission.ClearingHousePartners
        .Where(m => string.IsNullOrWhitespace(m.ClearingHouseName))
        .Remove();
    

    如果发布的名称值是空的,这将从列表中删除任何项目。如果您想要附加限定条件来确定不应保存对象,只需将它们作为附加子句添加到 Where 中即可。

    【讨论】:

    • 好主意,谢谢。但是,我不得不使用.RemoveAll() 并将谓词放在那个方法中,因为VS 在.Where() 之后无法识别.Remove()。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多