我正在使用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
}
}
***
您在FillMemberGrid()
中的return语句返回null,因为您试图将IList
转换为MemberList
无效。
var objMembers = new MemberList();
TranslateMembersBDOToMembersDTO(objMembersBDO, objMembers); // method below
return objMembers.MembersInList as MemberList;
objMembers
已经是成员列表。为什么要返回其MembersInList as MemberList
?您应该只返回objMembers
。