模型的结构与表不同,由于类型不同,更新数据库时出现问题

时间:2018-10-15 16:55:00

标签: asp.net-mvc model-view-controller model linq-to-entities

我正在努力使自己的头脑围绕MVC中模型的使用。由于需要在视图中使用模型,因此我设置的模型与与其协调的数据库表不同。但是,当用户从视图提交表单(可能提交更改的值)时,我需要使用这些新值来更新数据库。我遇到的问题是,当我使用lambda表达式时,无法获取与表匹配的数据类型。希望这将有助于更清楚地解释我的意思:

模型

public class DataSharingModels
{
    public string ReferenceID { get; set; }
    public NBTC NBTCGroup { get; set; }
    public Contractors ContractorsGroup { get; set; }
    public Coordinators CoordinatorsGroup { get; set; }
    public NGO NGOGroup { get; set; }
    public Public PublicGroup { get; set; }
    public SelectList FA_RA_List { get; set; }

}

public class NBTC
{
    public Boolean NBTC_FA_Centroid { get; set; }
    public Boolean NBTC_FA_Bound { get; set; }
    public Boolean NBTC_RA_Centroid { get; set; }
    public Boolean NBTC_RA_Bound { get; set; }
    public Boolean NBTC_Spring_Sum { get; set; }
    public Boolean NBTC_Spring_Analysis { get; set; }
    public Boolean NBTC_Spring_Locate { get; set; }
    public Boolean NBTC_Fall_Sum { get; set; }
    public Boolean NBTC_Fall_Analysis { get; set; }
    public Boolean NBTC_Fall_Locate { get; set; }
    public Boolean NBTC_HabMon_Sum { get; set; }
    public Boolean NBTC_HabMon_Analysis { get; set; }
    public Boolean NBTC_HabMon_Locate { get; set; }
    public Boolean NBTC_HabMgmt_Sum { get; set; }
    public Boolean NBTC_HabMgmt_Analysis { get; set; }
    public Boolean NBTC_HabMgmt_Locate { get; set; }
    public Boolean NBTC_Inventory_Sum { get; set; }
    public Boolean NBTC_OpSvy_Sum { get; set; }
    public Boolean NBTC_OpSvy_Individ { get; set; }
}

//The NBTC class is essentially repeated four more times for Contractors,
// Coordinators, NGO, and Public. The prefixes are changed 
//for the properties that make up those classes. 

public class Contractors
{
    public Boolean Contractors_FA_Centroid { get; set; }
    public Boolean Contractors_FA_Bound { get; set; }
    public Boolean Contractors_RA_Centroid { get; set; }
    public Boolean Contractors_RA_Bound { get; set; }
    public Boolean Contractors_Spring_Sum { get; set; }
    public Boolean Contractors_Spring_Analysis { get; set; }
    public Boolean Contractors_Spring_Locate { get; set; }
    public Boolean Contractors_Fall_Sum { get; set; }
    public Boolean Contractors_Fall_Analysis { get; set; }
    public Boolean Contractors_Fall_Locate { get; set; }
    public Boolean Contractors_HabMon_Sum { get; set; }
    public Boolean Contractors_HabMon_Analysis { get; set; }
    public Boolean Contractors_HabMon_Locate { get; set; }
    public Boolean Contractors_HabMgmt_Sum { get; set; }
    public Boolean Contractors_HabMgmt_Analysis { get; set; }
    public Boolean Contractors_HabMgmt_Locate { get; set; }
    public Boolean Contractors_Inventory_Sum { get; set; }
    public Boolean Contractors_OpSvy_Sum { get; set; }
    public Boolean Contractors_OpSvy_Individ { get; set; }
}
//And so on and so forth...

在SQL数据库表中,其结构更像这样:

PermissionID | FocalRefID | ShareGroup | StateID | CIP_FA_Centroid | CIP_FA_Boundary | etc...
1            | <guid>     |   NBTC     |   NE    |   Allowed       | Allowed
2            |<same guid> |Contractors |   NE    | Not Allowed     | Allowed
3            |<same guid> |Coordinators|   NE    | Not Allowed     | Not Allowed
4            |<same guid> |   NGO      |   NE    |     Allowed     | Allowed
5            |<same guid> |   Public   |   NE    |     Allowed     | Not Allowed

忽略该guid在此表中不是真实的guid(它不是主键)...在模型中,ReferenceID属性将具有FocalRefID中表示的值表的字段。类NBTC具有在NBTC字段中具有ShareGroup的数据库中满足单个记录所需的所有属性(因此具有NBTC ShareGroup的记录将在{ {1}}字段对应于属性CIP_FA_Centroid

当我到达控制器以将更改保存到数据库时,我正在使用这样的lambda表达式(我将添加更多属性以使其仅提取一条记录,因为如表所示,多条记录在表中具有相同的FocalRefID上方):

NBTC_FA_Centroid

不幸的是,这无法正常工作,因为它无法将类型NBTC nbtc = db.SharingPermissions.SingleOrDefault( NBTC => NBTC.FocalRefID == refID); (数据库表)转换为类型SharingPermission

  

不能将类型'FocalAreaCounts.Models.SharingPermission'隐式转换为'FocalAreaCounts.Models.NBTC'

我要做的是使用与模型中发送回的记录相同的FocalRefID(和其他属性)提取记录,并更新表中的值。我只是对我如何使用模型或lambda表达式感到困惑。

1 个答案:

答案 0 :(得分:0)

对我来说很明显,我返回的是错误的类型,只是我不明白什么是正确的类型。我的模型已经填充了NBTC类,这是与模型的其他部分一起发送回控制器的,因此我不想创建新的NBTC类型变量。由于我想从数据库中提取一条记录并将其存储在我的变量中,因此返回类型应该是数据库类的,在这种情况下,该类型是SharingPermission类。新的lambda表达式:

right([your column], [result from above] - 1)
相关问题