经过之前的准备目前我们的项目,终于可以搞正式的开发工作了。

创建实体Person

在Core类库中添加Person类

/// <summary>
/// 联系人
/// </summary>
public class Person : FullAuditedEntity
{
/// <summary>
/// 姓名
/// </summary>
[Required]
[MaxLength(PhoneBookConsts.MaxNameLength)]
public virtual string Name { get; set; } /// <summary>
/// 邮箱地址
/// </summary>
[MaxLength(PhoneBookConsts.MaxEmailAddressLength)]
public virtual string EmailAddress { get; set; }
}

然后在PhoneBookConsts类中添加几个常量:

/// <summary>
/// 电话薄项目的使用常量
/// </summary>
public static class PhoneBookConsts
{
public const string LocalizationSourceName = "PhoneBook"; /// <summary>
/// 名字最大长度
/// </summary>
public const int MaxNameLength = 32; /// <summary>
/// 邮件地址最大长度
/// </summary>
public const int MaxEmailAddressLength = 255;
}

提示:

person的主键为INT类型。

他集成了FullAuditedEntity,它包含了创建、修改、删除、审核属性。这里的删除是指“软删除”。

当我们删除一个人的时候,他不是从数据库中删除,而是被标记为删除状态。我们创建了一个常量为MaxNameLength的属性,这么做有一个好处,因为稍后我们可以将相同的值用不到不同的实体属性上。

然后这个时候就可以进行数据库迁移了会在数据库生成Person这个表。

但是我偏不。为嘛呢。我可是一个有代码生成器的男人*(实力硬广)

使用代码生成器

下载地址:https://visualstudiogallery.msdn.microsoft.com/b1364d50-a445-433f-971c-373b402b6694

这个的安装过程就不说 了。要是你不会。。加群吧,我教你

使用之前的准备工作

ABP的代码生成器是为了让大家更好的工作,所以在有些地方是做了处理的。我们就先来准备点东西吧

首先准备个常量类,放到Core项目中的根目录

/// <summary>
/// 一些程序中会使用到的通用常量
/// </summary>
public static class YoYoCMSConsts
{ /// <summary>
/// 显示名称的最大长度
/// </summary>
public const int MaxDisplayNameLength = 64; /// <summary>
/// 用户名的最大长度
/// </summary>
public const int MaxUserNameLength = 32; /// <summary>
/// 数据库架构名
/// </summary>
public static class SchemaName
{
/// <summary>
/// 基础设置
/// </summary>
public const string Basic = "Basic"; /// <summary>
/// 模块管理
/// </summary>
public const string Moudle = "Moudle"; /// <summary>
/// 网站设置
/// </summary>
public const string WebSetting = "WebSetting";
/// <summary>
/// 用于对多对表关系的结构
/// </summary>
public const string HasMany = "HasMany"; /// <summary>
/// 业务
/// </summary>
public const string Business = "Business"; } }

创建一个PagedAndSortedInputDto.cs类

public class PagedAndSortedInputDto : IPagedResultRequest, ISortedResultRequest
    {
        public string Sorting { get; set; }

public PagedAndSortedInputDto()
        {
            MaxResultCount = PhoneBookConsts.DefaultPageSize;
        }

[Range(1, PhoneBookConsts.MaxPageSize)]
        public int MaxResultCount { get; set; }

[Range(0, int.MaxValue)]
        public int SkipCount { get; set; }

}

打开nuget管理器

将ef、System.Linq.Dynamic安装到application中

然后生成代码

怎么使用呢。找到我们的web项目。

然后如下图所示:

右键web项目,添加、新建基建项目

选择”添加模块功能“

然后选择Person实体

然后可以看到生成出来的代码:

首先将EntityFramework中的EntityMapper剪切到YoYoCMS.PhoneBook.EntityFramework中。

然后根据PersonCfg.cs中的todo:提示

public class PersonCfg : EntityTypeConfiguration<Person>
{
public PersonCfg ()
{
ToTable("Person", YoYoCMSConsts.SchemaName.Basic); //todo: 需要将以下文件注入到YoYoCMS.PhoneBook.PersonsDbContext中 // public IDbSet<Person> Persons { get; set; }
// modelBuilder.Configurations.Add(new PersonCfg()); // 姓名
Property(a => a.Name).HasMaxLength(32);
// 邮箱地址
Property(a => a.EmailAddress).HasMaxLength(255);
}
}

将public IDbSet<> Person> Persons { get; set; }和modelBuilder.Configurations.Add(new PersonCfg());

打开”PhoneBookDbContext.cs”文件在//TODO: Define an IDbSet for your Entities...下面粘贴上

public IDbSet<> Person> Persons { get; set; }

手动创建方法,

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

modelBuilder.Configurations.Add(new PersonCfg());
base.OnModelCreating(modelBuilder);

         }

最后的效果:

public class PhoneBookDbContext : AbpZeroDbContext<Tenant, Role, User>
{
//TODO: Define an IDbSet for your Entities... public IDbSet<Person> Persons { get; set; } /* NOTE:
* Setting "Default" to base class helps us when working migration commands on Package Manager Console.
* But it may cause problems when working Migrate.exe of EF. If you will apply migrations on command line, do not
* pass connection string name to base classes. ABP works either way.
*/
public PhoneBookDbContext()
: base("Default")
{ } /* NOTE:
* This constructor is used by ABP to pass connection string defined in PhoneBookDataModule.PreInitialize.
* Notice that, actually you will not directly create an instance of PhoneBookDbContext since ABP automatically handles it.
*/
public PhoneBookDbContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{ } //This constructor is used in tests
public PhoneBookDbContext(DbConnection connection)
: base(connection, true)
{ } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new PersonCfg()); }
}

然后再次打开

将以上代码剪切到Core类库中。

将下图的代码,剪切到application类库中

然后我们再一步步的解释这些分别怎么用

本地化多语言

将PersonReadMe.cs中的文件

复制粘贴到“PhoneBook-zh-CN.xml”文件中.

注意这个文件中不能有重复的name,否则会报错

其他的提示信息同理,放到对应的文件中。

//TODO:多页面后端的导航栏目设计

    /*
//无次级导航属性
var person=new MenuItemDefinition(
PersonAppPermissions.Person,
L("Person"),
url:"Mpa/PersonManage",
icon:"icon-grid",
requiredPermissionName: PersonAppPermissions.Person
); */
//有下级菜单
/* var person=new MenuItemDefinition(
PersonAppPermissions.Person,
L("Person"),
icon:"icon-grid"
); person.AddItem(
new MenuItemDefinition(
PersonAppPermissions.Person,
L("Person"),
"icon-star",
"person",
requiredPermissionName: PersonAppPermissions.Person)); */ //配置权限模块初始化 //TODO:★需要到请将以下内容剪切到YoYoCMSApplicationModule
// Configuration.Authorization.Providers.Add<PersonAppAuthorizationProvider>(); //TODO:★请将以下内容剪切到CORE类库的Localization/Source/zh-cn.xml
/*
<!-- 联系人管理 --> <text name=" PersonHeaderInfo" value="联系人信息列表" />
<text name="PersonDeleteWarningMessage" value="联系人名称: {0} 将被删除,是否确定删除它。" /> <text name="PersonName" value="联系人" /> <!--//用于表格展示的数据信息的标题-->
<text name="Name" value="姓名" />
<text name="EmailAddress" value="邮箱地址" />
<text name="LastModificationTime" value="最后编辑时间" />
<text name="CreationTime" value="创建时间" /> <text name="Person" value="联系人管理" />
<text name="CreatePerson" value="新增联系人" />
<text name="UpdatePerson" value="更新联系人" />
<text name="DeletePerson" value="删除联系人" />
*/ /*
<!-- 联系人english管理 -->
<text name=" PersonHeaderInfo" value="联系人List" /> <text name="Person" value="ManagementPerson" />
<text name="CreatePerson" value="CreatePerson" />
<text name="UpdatePerson" value="UpdatePerson" />
<text name="DeletePerson" value="DeletePerson" />
*/

文中涉及权限一块的内容,因为没有做权限页面左右我就删除掉了。保证他不出错就可以了。

生成迁移数据库

迁移命令:Add-Migration add_Person

然后进行update-database,数据库的表应该就正常的ok了

然后我们要添加菜单打开“PhoneBookNavigationProvider”

然后添加

var person = new MenuItemDefinition(
PersonAppPermissions.Person,
L("Person"),
url: "PersonManage",
icon: "fa fa-user-md"
);

添加到users后面,这里的添加顺序是受菜单的影响的说。

添加控制器,生成视图文件

运行项目

可以看到我们的联系人管理。这个时候呢,我们的联系人管理缺没有被选中,下一步就开始改造视图的CSS效果

制作选中效果

回到我们的菜单导航页面

var person = new MenuItemDefinition(
PersonAppPermissions.Person,
L("Person"),
url: "PersonManage",
icon: "fa fa-user-md"
);

然后回到视图页面

做一点小小的修改。

刷新后,发现ok了。

the end

-返回目录-  ABP打造一个《电话簿项目》

在ABP中创建Person实体类的更多相关文章

  1. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

  2. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  3. 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

    题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...

  4. 在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句:

    在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句: 如果是String类型的字符串进行判空的时候: <if test=&q ...

  5. Abp项目中的领域模型实体类访问仓储的方法

    首先声明,不推荐使用这种方法.实体访问仓储是不被推荐的! 1.简单粗暴的方法 Abp.Dependency.IocManager.Instance.Resolve>(); 2.绕个弯子的方法 首 ...

  6. Java中entity(实体类)的写法规范

    在日常的Java项目开发中,entity(实体类)是必不可少的,它们一般都有很多的属性,并有相应的setter和getter方法.entity(实体类)的作用一般是和数据表做映射.所以快速写出规范的e ...

  7. spring sts 从数据库中反向生成实体类

    首先我们要在sts中建立mysql的数据库连接 1. 当点击ok之后,如果没有报错的话就应该是建立好了,我们可以点击查看这个数据库中所有的表 我们就可以再sts进行数据库操作了,具体如下: 点击如下按 ...

  8. idea中自动生成实体类

    找到生成实体的路径,找到Database数据表 找到指定的路径即可自动生成entity实体 在创建好的实体类内如此修改 之后的步骤都在脑子里  写给自己看的东西 哪里不会就记录哪里 test类(以前都 ...

  9. ibatis的xml中resultmap是实体类与查询结果的一个映射

    resultmap可以少于实体类的属性,但是resultmap中的映射列,必须在查询结果中有

随机推荐

  1. 日期格式代码出现两次的错误 ORA-01810

    错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...

  2. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  3. nginx+php的使用

    原文来自:windows下配置nginx+php环境 按照他的步骤走,亲测可用! 但是这里他后面说的根目录可能有些人有点懵. 其实在设置的时候就设置了: 网站根目录就是www这个目录,如果没创建请自行 ...

  4. [WCF]缺少一行代码引发的血案

    这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...

  5. 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型

    前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.

  6. 微信小程序服务范围重大更新

    12.29日,小程序服务范围做了重大更新,增对富媒体和工具类型的小程序,增加了很多细分领域 富媒体:增加资讯,FM电台,有声读物等,媒体平台可上小程序了 工具:信息查询,网络代理,健康,企业管理等 , ...

  7. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  8. HTML5 标签 details 展开 搜索

    details有一个新增加的子标签--summary,当鼠标点击summary标签中的内容文字时,details标签中的其他所有元素将会展开或收缩. 默认状态为 收缩状态 设置为展开状态为 <d ...

  9. mysql源码包手动安装、配置以及测试(亲测可行)

    笔记编者:小波/qq463431476博客首页:http://www.cnblogs.com/xiaobo-Linux/ 记下这篇mysql笔记,望日后有用! redhat6采用centos yum源 ...

  10. 第10章 Shell编程(4)_流程控制

    5. 流程控制 5.1 if语句 (1)格式: 格式1 格式2 多分支if if [ 条件判断式 ];then #程序 else #程序 fi if [ 条件判断式 ] then #程序 else # ...