Asp.net core WebApi
一、WebApi
launchSetting.json
没用的都删掉
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"webApi": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "weatherforecast",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Startup里面的配置
没有使用services.AddMvc(),它提供的服务太多了,用不上
services.AddControllers()仅仅包换构建api的一些服务 有他就够用了
public void ConfigureServices(IServiceCollection services)
{
//服务的容器,这里注册的服务,已经注册的服务,可以通过依赖注入的方式在其他地方使用
//服务的概念 :在整个程序中做一些通用性操作的组件
services.AddControllers(
configure: setup =>
{
//请求的类型和服务器所支持的类型不一致,就会返回406状态码
setup.ReturnHttpNotAcceptable = true;
//添加返回格式支持
// setup.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
//修改默认格式
}
)
.AddXmlDataContractSerializerFormatters();//推荐这种方法
//仅仅包换构建api的一些服务 有他就够用了
//services.AddMvc();//提供的服务太多了,用不上
services.AddScoped<ICompanyRepository, CompanyRepository>();
//添加Sqlite服务,并配置生成的迷你数据库文件的名字
services.AddDbContext<RoutingDbcontext>(
optionsAction:options=>options.UseSqlite(connectionString:"Data Source = routine.db")
);
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
}
数据库类配置
然后数据库迁移就行了
public class RoutingDbcontext:DbContext
{
//调用父类把options配置传过去才能工作
public RoutingDbcontext(DbContextOptions<RoutingDbcontext> options):base(options)
{
}
//映射数据库的两个表
public DbSet<Company> companies { set; get; }
public DbSet<Employee> employees { set; get; }
//------------------- add Limit ----------------
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Company>().Property(x => x.Name).IsRequired().HasMaxLength(100);//添加限制
//this specified for between two class of relationship
modelBuilder.Entity<Employee>().HasOne(navigationExpression: x => x.Company)//导航属性时company(一个员工在一个公司)
.WithMany(navigationExpression: x => x.Employees)//反过来时Emploees (一个公司拥有多个员工的集合)
.HasForeignKey(x => x.CompanyId).OnDelete(DeleteBehavior.Restrict);//外键时CompanyId,删除的时候公司有员工的话是无法删除的
//seed data 种子数据
modelBuilder.Entity<Company>().HasData(new Company {
Id = Guid.Parse("00000000-0000-0000-0000-000000000001"),
Name="Microsoft",
Introduction="Great Company"
});
}
}
将一个对象映射到另一个对象
安装包:AutoMapper.Extensions.Microsoft.DependencyInjection
添加服务
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
创建Profile文件夹添加CompanyProfile.cs类继承自AutoMapper.Profile
public class CompanyProfile:Profile
{
//映射的配置文件
public CompanyProfile()
{
//从Company映射到CompanyDto
//约定:1.原属性和目标属性一样的话,他属性的值就会赋给目标属性
//2.如果目标的属性再原属性中不存在,直接就忽略了,不会对它进行赋值
// 原类型Company映射到CompanyDto
CreateMap<Company, CompanyDto>()
//执行手动映射(常用)
.ForMember(
//Name 映射到 CompanyName
destinationMember: dest => dest.CompanyName,
memberOptions: opt => opt.MapFrom(mapExpression: src => src.Name)
);
}
}
使用
//注入IMapper服务 _mapper
var companyDtos = _mapper.Map<IEnumerable<CompanyDto>>(companies);
var companyDto = _mapper.Map<CompanyDto>(company);