asp.net 请问实体类的属性要全部加载吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 请问实体类的属性要全部加载吗?相关的知识,希望对你有一定的参考价值。

比如说一个问题类,用标题, 内容, 发表人, 发表时间, 分类等。
DAL层是面向模型填充的,它一次填充一个模型或模型集合。
但是我现在只需要列表显示标题和发表人。这样问题内容也会加载,但用不到。
还有关闭问题时,BLL中根据传入的ID取一个问题对象,因为要判断是否存在, 检测当前问题状态,检测当前操作人和发表人, 等等. 还有很多类似的地方,只用到其中几个属性, 但就算只用到一个, 我的问题都要整个加载。
请问应该怎么写呢,另外写实体类的方式不好,需求很多时要写无数个,关键是我DAL层是对对应的模型进行增删改查, 填充的。如DAL_Question类就操作MDL_Question模型。急救啊!!!

如果说你只有一个操作,且这个操作只是涉及到其中的两三个属性,那么在实体类中只相应的设置那几个字段的属性就好了。关键是你在上面提到会有很多操作,不同的操作过程中所使用的字段属性也不一样,那所有的属性全部放在实体类中就好了。一定的冗余状况是允许存在的,如果说你想的是到哪个字段用到哪个属性的话,那就对应的多创建几个实体类吧,类的名字不一样就好,不过你说这样,得不偿失,何必啊?!
问题1:但是我现在只需要列表显示标题和发表人。这样问题内容也会加载,但用不到。
你在使用GridView标签的时候,在其DataField属性中可对应设置几个字段值,用不到的问题内容字段就不用给了。不过一般来说ID都得加上去。将gridview的属性AutoGenerateColumns设置为false。给个大致的例子吧:
<asp:GridView ID="gvQuestion" runat="server" Width="100%" AutoGenerateColumns="False" DataKeyNames="QuestionOID">
<Columns>
<asp:HyperLinkField DataTextField="QuestionTitle" HeaderText="标题" />
<asp:BoundField DataField="QuestionDrafter" HeaderText="发表人" />
</Columns>
</asp:GridView>
问题2:关闭问题。
先比如你在数据库中的字段哈-QuestionOID(主键ID),QuestionTitle(标题),QuestionContent(内容),QuestionDrafter(发表人),QuestionCreateTime(创建时间),QuestionClassify(分类),QuestionCurrentOperater(当前操作人),QuestionCurrentOperateId(当前操作人id),QuestionStatus(状态-0发表,1未发表,2-回收,3-删除。。。),QuestionIsdeleted(是否删除-0不可删,1可删)。
你的问题中因为要检测是否存在,状态,操作人,发表人。。。
那就写一个获取数据的操作类哈,使用的时候对应的获取其相应的字段值就好,举例:
//BLL层 假设类 QuestionDB.cs
public static DataTable GetQuestionInfoById(string questionId)

//假设表名QuestionInfo
string strSql = @"select * from QuestionInfo where QuestionOID =@questionid and QuestionIsdeleted=0"; //当然现实当中最好不用*,列出所有字段
using(sqlConnection conn = new sqlConnection(/*这里是你的连接字符串*/))

sqlParameter[] paras = new sqlParameter[1];
paras[0] = new SqlParameter("@questionid", SqlDbType.varchar,200);
paras[0].Value = questionId;

DataSet ds = SqlHelper.ExecuteDataset(conn, CommandType.Text, strSql, paras); //自己导入一个SqlHelper类哈
if(ds!=null and ds.Tables[0]!=null)

return ds.Tables[0];

else
return null;


使用的时候,对应的给属性值就行了。string title = QuestionDB.GetQuestionInfoById(ID).Rows[0]["QuestionTitle"].ToString(); 等等
有点粗糙,不过大致的原理你一定都懂的。
问题3:写实体类的方式不好。需求很多时要写无数个。
这个你就需要用到工具了。

自动生成代码工具-居家常备良药“动软.Net代码生成器”。(突出重点,专门一行)

呵呵……百度一下,这工具着实不错,我们公司都用这个,你所需要的实体类和基本的 增删改查的BLL层代码都有了!省了你大把时间,那么多 属性,还用自己敲嘛?不怕手疼你就慢慢敲。呵呵。

基础的会了,就可以像楼上这么多高人采用的方式,使用子类、反射等动态加载方式了。
参考技术A 这个地方用不到,那你其他地方应该能用到,否则你这个实体类就应该减少属性了。我认为这样的情况是可以接受的,不影响性能和整个代码的完整。如果非要动态的加载,你应该使用反射,自己去写个方法来加载你需要的属性。如果实在接受不了,你就应该不用实体类了 参考技术B 建议:常用的属性定义为基类,使用子类扩充基类属性。

这要看你模型内属性使用的什么类型的数据,简单类型占用很小很小的空间,符合类型占用的空间会稍大一点,我感觉性能方面影响不是很大。如果像你所说用不到其他属性,可以删除,或者很少使用可以在定义一个基类,让其他类继承。或者使用DataTable。
参考技术C 这个问题没有标准答案!全看您在开发效率还是程序运行效率之间的抉择。如果从开发效率讲,数据冗余是一定的,你当然可以为了每个Bll都开发新的模型。我的建议如果数据冗余不是很影响程序运行的话,不要建立新的模型了。本回答被提问者采纳 参考技术D 不用全部加载

在asp.net MVC3中怎么为一个实体类的ID属性设置为自动增长呢?此时ID不是主键,Code才是主键?如下

public class User

public int ID get;set;
[Key]
public string UserCode get;set;
此时怎么把ID设置为自动增长呢?请指点?

你库里有ID吗,
如果有,入库时ID= max(ID)+1
如果没有,你从库里取出来时,要么是datatable,dataset要么是datareader,在遍历他们的时候,手动设置ID就行
参考技术A using System.ComponentModel.DataAnnotations;

public class User

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public int ID get;set;
[Key]
public string UserCode get;set;

以上是关于asp.net 请问实体类的属性要全部加载吗?的主要内容,如果未能解决你的问题,请参考以下文章

个人总结2019 ASP.NET面试题

在asp.net MVC3中怎么为一个实体类的ID属性设置为自动增长呢?此时ID不是主键,Code才是主键?如下

[Asp.net mvc]实体更新异常:存储区更新插入或删除语句影响到了意外的行数。实体在加载后可能被修改或删除。

带有实体框架的 ASP.Net Core Web API 使用存储过程有啥好处吗? [关闭]

asp.net 使用存储过程时参数为空时的处理

asp.net使用Model层与不使用Model区别