visual studio有没有办法从数据库表直接生成一个类对象?

wjjdnajj 2020-05-20 10:31:00
比如表的字段是id,姓名,性别vs2019直接生成如下的类:


public class user()
{
public int id{get;set;}
public string username{get;set;}
public bool sex{get;set;}
}
...全文
1413 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_22092171 2022-10-29
  • 打赏
  • 举报
回复

拷贝表的生成语句,贴到新建类里,做几下文本替换就OK了,换上类型,{get;set;}搞定

danny_2020 2020-07-28
  • 打赏
  • 举报
回复
这个方法就是表转结构的 public IEnumerable<EDRUGUSEINFO> getEDRUGUSEINFO(string OftenNo) { try { string wherestr = string.Empty; if (!string.IsNullOrEmpty(OftenNo)) wherestr += string.Format(" and OftenNo = '{0}'", OftenNo); string sql = string.Format(@"select oftenNo,drugid,Drug_quantity,Drug_batch_no from DRUGUSE_VW where 1=1 {0}", wherestr); return DB.Query<EDRUGUSEINFO>(sql, null); } catch { return null; } }
  • 打赏
  • 举报
回复
在我们的绝大多数项目中,底层落地的数据结构可能是经过了5年以上发展的。你无法用一个刚开始写某行业软件的人的方式去想象数据库 Model 模式。因为相关的数据操作代码,随时可能有某块要对库表和功能语句扩展。只有刚写某行业的程序的人才会“喜欢”每次都推倒重建整个 Model 代码以及所有相关业务逻辑代码的形式,有经验的人则是平常只修改某程序中的十万分之一,不可能用“推倒重来”的思路去思考问题。而是更稳健更长久更大型的系统扩展思路。
  • 打赏
  • 举报
回复
“EF本身就是把数据库里的表和对象Model进行映射”这个本身不是面向对象,这是 DBFirst 的,也就是面向关系数据库而非面向对象。

面向对象的数据库 DAL 层类似 db4o 的客户端驱动调用代码那样的,也就是类似
db.Set(obj);
这样的代码就能把任意的 c# 普通对象写入数据库,而不需要去生成什么 Model 类。要知道你的程序中一边设计以便产生的数据 class 有多少?你又有多少要专门维护 Model 模式?

“基于对象的”数据库DAL是 codeFirst 的。而 DBFirst 的不但不是 codeFirst,也更不是面向对象,因为它的数据库操作也不能去支持对象的继承。例如你读查询“牌号为 京B362372 的车辆”你并不能获得一个大型运输车类型的对象,也就是不支持继承扩展。

EF 只是比 SQL 稍微简单那么一点,免得你把某类型 Model 的读取时的几个属性都写一遍属性名字。但是缺点是你不能指定哪些属性需要读取,你也不能在开发时经常扩展和改变 Model(因为对于大型系统来说每一次重建 Model 都会覆盖和丢失许多自己的 Model 扩展代码),写很灵活的 sql 语句。只能很简单地用一下 EF。

使用 EF 用在大系统(就好像随便一个创业公司做的项目)中的一个最基本的要求,就是不要只用 EF。要同时使用另外1、2种以上的 DAL 系统来操作关系数据库,各取所长。特别是要用好 .net 中基本的 ADO.NET 原生语句。
jsjhj2008 2020-07-18
  • 打赏
  • 举报
回复
参考EF,连接上数据后,可以自动生成实体类,EF本身就是把数据库里的表和对象Model进行映射,这样才叫面向对象
八爻老骥 2020-07-09
  • 打赏
  • 举报
回复
ef 不是有 db first么
吉普赛的歌 2020-07-09
  • 打赏
  • 举报
回复
就是一个代码生成器, C# 写一下模型类,也就 半小时 时间吧。 如果你对数据库非常熟悉, 用存储过程写一个也很容易, 时间上差不多, 半小时。
lvbinlt 2020-07-08
  • 打赏
  • 举报
回复
为啥不用EF
快乐起航2020 2020-07-07
  • 打赏
  • 举报
回复
动软代码生成器
xinyuchen1 2020-07-07
  • 打赏
  • 举报
回复
CodeSmith
jhdxhj 2020-07-01
  • 打赏
  • 举报
回复
动软代码生成器
快乐起航2020 2020-07-01
  • 打赏
  • 举报
回复
动软代码生成器
天空丶蒋 2020-06-30
  • 打赏
  • 举报
回复
 private string GetTableAndFieldInfoSql(string schemaName, string tableName, bool isOrder = true)
        {
            var sql = @"SELECT CASE
           WHEN col.colorder = 1
           THEN obj.name
           ELSE ''
       END AS 表名, 
       col.colorder AS 序号, 
       col.name AS 列名, 
       ISNULL(ep.[value], '') AS 列说明, 
       t.name AS 数据类型, 
       col.length AS 长度, 
       ISNULL(COLUMNPROPERTY(col.id, col.name, 'Scale'), 0) AS 小数位数,
       CASE
           WHEN COLUMNPROPERTY(col.id, col.name, 'IsIdentity') = 1
           THEN '√'
           ELSE ''
       END AS 标识,
       CASE
           WHEN EXISTS
(
    SELECT 1
    FROM dbo.sysindexes si
         INNER JOIN dbo.sysindexkeys sik ON si.id = sik.id
                                            AND si.indid = sik.indid
         INNER JOIN dbo.syscolumns sc ON sc.id = sik.id
                                         AND sc.colid = sik.colid
         INNER JOIN dbo.sysobjects so ON so.name = si.name
                                         AND so.xtype = 'PK'
    WHERE sc.id = col.id
          AND sc.colid = col.colid
)
           THEN '√'
           ELSE ''
       END AS 主键,
       CASE
           WHEN col.isnullable = 1
           THEN '√'
           ELSE ''
       END AS 允许空, 
       ISNULL(comm.text, '') AS 默认值
FROM dbo.syscolumns col
     LEFT JOIN dbo.systypes t ON col.xtype = t.xusertype
     INNER JOIN dbo.sysobjects obj ON col.id = obj.id
                                      AND obj.xtype = 'U'
                                      AND obj.STATUS >= 0
     INNER JOIN sys.all_objects allObj ON allObj.object_id = obj.id
     INNER JOIN sys.schemas s ON allObj.schema_id = s.schema_id
     LEFT JOIN dbo.syscomments comm ON col.cdefault = comm.id
     LEFT JOIN sys.extended_properties ep ON col.id = ep.major_id
                                             AND col.colid = ep.minor_id
                                             AND ep.name = 'MS_Description'
     LEFT JOIN sys.extended_properties epTwo ON obj.id = epTwo.major_id
                                                AND epTwo.minor_id = 0
                                                AND epTwo.name = 'MS_Description'
WHERE obj.name = '" + tableName + @"'--表名 
      AND s.name = '" + schemaName + @"' --架构名";
            if (isOrder)
            {

                sql += " ORDER BY col.colorder ";
            }
            return sql;
        }
可以参考此方法实现~
  • 打赏
  • 举报
回复
10年 就有小软件 针对表结构直接生成反射类了。 但是不好用的, 关联查询的时候你还得改。 而且你也不是要取出全部反射类。 反正我是很反感这样弄一堆实体反射类。
mirrorspace 2020-06-30
  • 打赏
  • 举报
回复
这活是写ORM的拿手好戏 一个实现就是,字段名字和表字段名字一样,循环dataRead里的数据,实例化类,负值属性.这个用到反射那个命名空间的工具
低丶调 2020-06-30
  • 打赏
  • 举报
回复
随便找个第三方工具吧,在vs里面搞,我看前面的人发的博客园的链接,感觉好繁琐,一老点下一步下一步什么的, 我也有时候懒得写这些,用了一些工具,但是发觉还不是特别如意,主要是有点神经质,一会想这样,一会想那样,后来不厌其烦自己写了个,代码写的乱七八糟的,一股脑也把html,controller,要访问数据库那些文件都生成了,然后自动放到项目(就是修改csproj那个文件),后面有调整就自己去改代码,持续集成一些新的 感觉也有点辛苦,集成这个工具的时间有点久.....主要是凌乱想法太多了.......
Bridge_go 2020-06-16
  • 打赏
  • 举报
回复
Entity Framework Code First 自动生成对应表的对象
  • 打赏
  • 举报
回复
给你写个例子,我们简单地写两个 SQL Helper 扩展函数来为 DbParameter 增加参数,以及封装 DbDataReader 来返回 List<>,然后程序员调用时就可以写
EntryItems = db.CreateCommand("select * from [AccountingEntry$$Item] where ParentId=@id and [科目]=N'应收保险公司手续费'")
.SetParam("id", ParentId)
.ExecuteList(r => new EntryItem
{
产品 = r.GetValue<string>("产品"),
TagMoney1 = r.GetValue<decimal>("TagMoney1"),
金额 = r.GetValue<decimal>("金额")
});

这类代码可以直接把 sql 查询结果灵活装入 EntryItem 类型数据结构中。

实际开发时其实真正复杂的地方在于“灵活性”,项目开发的复杂点并不是一开始的最底层脱离了高层的死板要求。
  • 打赏
  • 举报
回复
如果你只是临时使用一些数据表,那么其实可以写“两个”将 DbCommand 与 List<ExpandoObject> 或者 JArray 双向转换的方法,写一遍就行了。
  • 打赏
  • 举报
回复
实际上就一些“失血的”Model,不过是 class 名字加上一些带有 {get;set;} 的属性,真的不如手写一遍。
加载更多回复(7)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧