VS2017, C# nTier с WCF / EF, не может создать экземпляр возвращенного объекта с IList строк из EF6 Entify - PullRequest
0 голосов
/ 09 мая 2020

Я создаю 5-уровневое решение VS C# с проектами UI, Service, Logi c, Business-Data и Data-Layers. Я использую WCF и EF6, причем EF6 загружен в пользовательский интерфейс, сервис и уровни данных. Я использую ADO. NET для сущностей на уровне данных, и моя сущность была построена как база данных.

У меня есть элемент управления DataGridView в моей Win-форме пользовательского интерфейса, и я хочу просмотреть все или выберите членов моей организации в DataGridView по запросу.

Когда я создаю экземпляр своей Службы в пользовательском интерфейсе, мой код работает, чтобы вернуть запрошенные строки данных из уровня данных (запрос EF) обратно через logi c слой на уровень сервиса.

Но когда я пытаюсь использовать возвращенный объект уровня сервиса, я получаю ошибку «Ссылка на объект не установлена ​​на экземпляр объекта».

Моя цель - использовать возвращенный список в качестве источника данных для элемента управления источником привязки для моего DataGridView. Мне также нужна помощь в понимании того, как получить доступ к объекту 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;
        }
    }

 ***

** Обновление кода на уровне данных и на уровне обслуживания - для перевода объекта DataContract «Члены» на уровне элемента данных в List. Здесь показан слой 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 members[index].(columnName) 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
 }                                                              
        }
 ***

** Изменения в коде на уровне сервиса: **

 ***
    public Members FillMemberGrid()
    {
        MembersBDO objMembersBDO = null;
        try
        {
            objMembersBDO = new MembersBDO();
            objMembersBDO = memberLogic.FillMemberGrid();
        }
        catch (Exception e)
        {
            var msg = e.Message;
            var reason = "FillMemberGrid Exception";
            throw new FaultException<MemberFault>(new MemberFault(msg), reason);
        }

        if (objMembersBDO == 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 Members();

        TranslateMembersBDOToMembersDTO(objMembersBDO, objMembers);  //a private method defined below

        return objMembers as Members;
    }
    private void TranslateMembersBDOToMembersDTO(MembersBDO objMembersBDO, Members objMembers)
    {
        //objMembers.MemberList = objMembersBDO.MemberBDOList;
        foreach (MemberBDO mBDO in objMembersBDO.memberBDOList)
        {
            Member m = new Member();
            TranslateMemberBDOToMemberDTO(mBDO, m);  //calling the same translate code that translates the return of a one member request 
            objMembers.MemberList.Add(m);
            m = null;
            m = new Member();
        }
    }
 ***

** Изменения в классе членов [DataContract] в IMemberService.cs **

 ***
  [DataContract]
  public class Members
  {
    [DataMember]
    public List<Member> MemberList { get; set; }  = new List<Member>();   
  }

 ***

** Вот изменение класса MembersBDO на уровне объекта бизнес-домена **

 ***

 [Serializable]
 public class MembersBDO
 {
    public List<MemberBDO> memberBDOList { get; set; } = new List<MemberBDO>();
 }

 ***

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Ваш оператор return в FillMemberGrid() возвращает null, потому что вы пытаетесь преобразовать IList в MemberList, что не сработает.

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

objMembers уже является членом List . Почему вы возвращаете его MembersInList as MemberList? Вам нужно просто вернуть objMembers.

0 голосов
/ 13 мая 2020

Спасибо, MBD, за помощь в решении моей проблемы. Нам всем нужна дека, и ваше предложение направило меня на верный путь. Смотрите мои обновления, чтобы узнать ответ, который я наконец начал использовать в приложении. Все еще есть проблемы, но не эта.

...