VS2017,具有WCF / EF的C#nTier,无法实例化具有EF6 Entire中的IList行的返回的obj

问题描述 投票:0回答:1

我正在使用UI,服务,逻辑,业务数据和数据层项目构建VS C#5层解决方案。我正在使用WCF和EF6,并将EF6加载到UI,服务和数据层中。我在数据层中的实体上使用ADO.NET,而我的实体是数据库优先的。

我在UI Win-Form上有一个DataGridView控件,我想按需在DataGridView中查看全部或选择我组织的成员。

当我在UI中实例化Service时,我的代码将获取请求的数据行,以从数据层(EF查询)返回,再通过逻辑层返回到Service层。

但是当我尝试使用服务层的返回对象时,收到“对象引用未设置为对象实例”错误。

我的目标是使用返回的列表作为DataGridView的Binding Source控件的数据源。我还需要帮助您了解如何获取I-List对象以暴露于其对象级别。任何帮助,将不胜感激,谢谢。

** Service Contract: **
***
 [DataContract]
 public class MemberList
 {
    [DataMember]
    public IList MembersInList { get; set; }
 }
***
[DataContract]
public class Member
{
    [DataMember]
    public int MemberID { get; set; }
    [DataMember ]
    public string Last_Name { get; set; }
    [DataMember]
    public string First_Name { get; set; }
    [DataMember]
    public string MidInit { get; set; }
    [DataMember]
    public string Email_Address { get; set; }

}
***
 ** Here's my datalayer: **
***
    public MemberBDOList FillMemberGrid()
    {
        MemberBDOList myDAO = new MemberBDOList();

        using (var afDBEntities = new AFDBEntities())
        {
            var members = afDBEntities.Members.ToList();    // gets all 68 Members in MSSQL table 

            if (members != null)
            {
                myDAO.MembersBDOInList = members; 
            }
        }
        return myDAO as MemberBDOList;  //returns all 68 Members to Logic Layer as collection
    }

***
** Here's my Service.cs object (Service layer): **
***
    public MemberList FillMemberGrid()
    {
        MemberBDOList  objMembersBDO = null;
        try
        {
            objMembersBDO = new MemberBDOList();
            objMembersBDO = memberLogic.FillMemberGrid();
        }
        catch (Exception e)
        {
            var msg = e.Message;
            var reason = "FillMemberGrid Exception";
            throw new FaultException<MemberFault>(new MemberFault(msg), reason);
        }

        if (objMembersBDO.MembersBDOInList == null)
        {
            var msg = string.Format("No members were found.");
            var reason = "FillMemberGrid: Empty Entity Member";
            throw new FaultException<MemberFault>(new MemberFault(msg), reason);
        }

        var objMembers = new MemberList();

        TranslateMembersBDOToMembersDTO(objMembersBDO, objMembers);  // method below
        return objMembers.MembersInList  as MemberList;
    }
    private void TranslateMembersBDOToMembersDTO(MemberBDOList objMembersBDO, MemberList objMembers)
    {
        objMembers.MembersInList = objMembersBDO.MembersBDOInList;
    }
 }
***
** Here is the Business-Data object: **
***
[Serializable]
  public class MemberBDOList
  {
        public IList MembersBDOInList { get; set; }
  }

***

** And here are the UI methods: **
***

    MemberServiceProxy.Member member;
    MemberServiceProxy.MemberList memberList;   

    private void btnFillMemberGrid_Click(object sender, EventArgs e)
    {
        BindingSource bSrc = new BindingSource();

        int M = 0;
        try
        {
            M = 1;
            memberList = GetMemberList();

            M = 3;
            //fails here with "Object reference not set to an instance of an object."
            bSrc.DataSource = memberList.MembersInList.ToList();  // fails with or without To-List

            M = 5;
            adgView.DataSource = bSrc;

            M = 7;
            adgView.Refresh();

        }
        catch (Exception ex)
        {
        }
    }

    private MemberList GetMemberList()
    {
        var results = new MemberList();
        int M = 0;
        try
        {
            M = 1;
            var client = new MemberServiceClient();

            M = 3;
            //go get the member list from Data Layer EF
            results = client.FillMemberGrid();

            return results;
        }
        catch (Exception ex)
        {
            return results;
        }
    }

 ***

**在数据层和服务层中的代码更新-在List中的数据成员级别转换DataContract“ Members”对象。在此处显示DAL层。 **

 ***
    public MembersBDO FillMemberGrid()
    {
        var membersBDO = new MembersBDO();
        var memberBDO = new MemberBDO();

        int M = 0;
        try
        {
            M = 1;
            using (var afDBEntities = new ACTSFactsDBEntities())
            {
                M = 3;
                var members = afDBEntities.Members.ToList();    // gets all 68 Members in MSSQL table (Entity is Database-first)

                M = 5;
                //     if (members != null)
                //     {
                //         M = 7;
                //         membersBDO.MemberBDOList = members;  //this works with the IList data contract, 
                //                                      //but the IList data, unconverted, belongs to the data layer -  no conversion is done
                //                                      //here from DAL data types to BDO data types at the membes[].item level
                //     }

                //so, (below) this solves that issue, and converts to the [DataMember] level (the data row's columns)
                //for each [DataContract] Member in "members" - the List<Member> object which belongs to the data layer project.
                //                                              
                M = 9;
                if (members != null)            //the data layer object has rows, good.
                {
                    int n = 0;
                    foreach (Member m in members)       //read through each data layer  EF Member type in "members" list
                    {
                        memberBDO = new MemberBDO()   //instantiate a new MemberBDO type to translate the DAL member.Columns to
                        {
                            MemberID = m.MemberID,        //each DAL column must be translated to its matching BDO type
                            Last_Name = m.Last_Name,
                            First_Name = m.First_Name,
                            MidInit = m.MidInit,
                            Email_Address = m.Email_Address,
                            Home_Phone = m.Home_Phone,
                            Cell_Phone = m.Cell_Phone,
                            Mailing_Address = m.Mailing_Address,  etc
                         };

                         membersBDO.memberBDOList.Add(memberBDO); 
                         memberBDO = null;
                        n += 1;
                        if (n > 60) break; // my code breaks at request for all 68 rows with error 
                                                 // - "MaxReceivedMessageSize" (65536 bytes) property exceeded
                    }
                }
                M = 11;
                return membersBDO;    //returning 61 of my 68 Members works to Service layer, through Logic Layer - will have to request/call a max # rows per page
            }                                                              
        }
 ***
c# wcf datagridview entity-framework-6 n-tier-architecture
1个回答
0
投票

您在FillMemberGrid()中的return语句返回null,因为您试图将IList转换为MemberList无效。

var objMembers = new MemberList();
TranslateMembersBDOToMembersDTO(objMembersBDO, objMembers);  // method below
return objMembers.MembersInList  as MemberList;

objMembers已经是成员列表。为什么要返回其MembersInList as MemberList?您应该只返回objMembers

© www.soinside.com 2019 - 2024. All rights reserved.