0

我在我的ASP MVC 3站点中使用实体框架来处理一对多关系。主表(AgentTransmission)模型对象包含List次表表格对象(ClearninghouseParnters)。感谢EF,我不需要做任何事情,只需保存ClearinghousePartnersFK字段的AgentTransmission对象来填充和保存。有条件保存辅助表对象

但是,用户获得的表单有五个用于输入Clearinghouse信息的字段。

enter image description here

的每一行代表一个新的ClearinghousePartners列表项的对象。不幸的是每个对象都被保存到数据库中,不管它是否包含数据。这并没有改变性能,甚至不显示页面的显示方式,但它会造成一张相当凌乱的表格。

我的问题是:有没有一种方法来指示实体框架仅保存在ClearinghousePartners列表对象的项目,如果存在价值无论是在ClearinghouseNameTradingPartnersNameStartDate列?

同样我想从表格中删除对象,如果我们发现一个项目发布回控制器并且存在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; } 
} 

控制LER

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

+0

好主意,谢谢。但是,我不得不使用'.RemoveAll()'并将Predicate放在该方法中,因为VS在'.Where()'之后不会识别'.Remove()'。谢谢 – NealR