针对.netcore2.1使用efDBfirst生成实体映射遇到的坑(Pomelo.EntityFrameworkCore.MySql篇)这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.NE
针对.net core 2.1 使用ef DBfirst 生成 实体映射遇到的坑 (Pomelo.EntityFrameworkCore.MySql 篇)这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.NET Core Pomelo Mysql 连接、.NET Core-EntityFrameworkCore-无法将类型为“ Query.Internal.EntityQueryable”的对象转换为类型为“ DbSet”的对象、.NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记、.NET 框架 - NETFramework + API + EF(DBFirst) + MYSQL等相关知识,希望可以帮助到你。
本文目录一览:- .net core 2.1 使用ef DBfirst 生成 实体映射遇到的坑 (Pomelo.EntityFrameworkCore.MySql 篇)
- .NET Core Pomelo Mysql 连接
- .NET Core-EntityFrameworkCore-无法将类型为“ Query.Internal.EntityQueryable”的对象转换为类型为“ DbSet”的对象
- .NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记
- .NET 框架 - NETFramework + API + EF(DBFirst) + MYSQL
.net core 2.1 使用ef DBfirst 生成 实体映射遇到的坑 (Pomelo.EntityFrameworkCore.MySql 篇)
core 2.1 发行不久,正好要把一个已存在的mysql db的项目 迁移至 core 2.1, 网上搜了很多帖子,基本两个工具类,一个是Pomelo.EntityFrameworkCore.MySql, 另一个是 MySql.Data.EntityFrameworkCore, 前者是国人出的,后者是 Oracle出的,我选择了试一下国人的版本,下边描述下步骤:
nuget 上边引用 Pomelo.EntityFrameworkCore.MySql,Microsoft.EntityFrameworkCore.Tools 这两个包
那么注意,问题来了,截止本文发布的时候,Pomelo.EntityFrameworkCore.MySql 的最新正式版是 2.0.1, 而不是预发行版的 2.1.0.rc1-final !!!如果用 2.0.1,我遇到了如下的问题:
这个也不清楚具体问题原因是什么,后来把 Pomelo.EntityFrameworkCore.MySql 重新引用安装了最新的 预发行版 2.1.0.rc1-final,命令行是能正常执行了,不过有两个问题:
#1.个别字段映射被跳过了,应该是工具类不完善,不能识别映射类型,需要自己再去手动添加一下,如下图, 需要手动加上bool 类型的定义 public bool IsRecommend {get;set;}
#2. core 2.1 ef 已经支持延迟加载,所以工具生成的实体中,外键引用部分的内容定义是没有virtual 属性的, 需要自己加上,关于 core 2.1的 延迟加载使用,帖子很多,这里就不写了
.NET Core Pomelo Mysql 连接
如何解决.NET Core Pomelo Mysql 连接
我正在尝试在 dotnet cli 中运行实体框架命令,但出现以下错误:
用户 ''''@''fe80::45b2:4add:f2de:ebcf%6'' 访问被拒绝(使用密码:NO)
这是我在启动时的代码:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1",new OpenApiInfo { Title = "NetCoreApp.API",Version = "v1" });
});
string MysqLConnectionStr = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContextPool<DataContext>(options => options.UseMysqL("server=localhost; port=3306; database=alohatest; user=netcore; password=0yetcxeY7MzThobL; Persist Security Info=False; Connect Timeout=300",ServerVersion.AutoDetect(MysqLConnectionStr)));
}
这就像 EF 没有采用正确的连接字符串。
更新:
这是我的完整例外:
dotnet ef dbcontext info
Build started...
Build succeeded.
The Entity Framework tools version ''5.0.5'' is older than that of the runtime ''6.0.0-preview.3.21201.2''. Update the tools for the latest features and bug fixes.
MysqLConnector.MysqLException (0x80004005): Access denied for user ''''@''fe80::45b2:4add:f2de:ebcf%6'' (using password: NO)
at MysqLConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs,Int32 startTickCount,ILoadBalancer loadBalancer,IOBehavior ioBehavior,CancellationToken cancellationToken) in /_/src/MysqLConnector/Core/ServerSession.cs:line 494
at MysqLConnector.Core.ConnectionPool.ConnectSessionAsync(String logMessage,CancellationToken cancellationToken)
in /_/src/MysqLConnector/Core/ConnectionPool.cs:line 368
at MysqLConnector.Core.ConnectionPool.GetSessionAsync(MysqLConnection connection,CancellationToken cancellationToken) in /_/src/MysqLConnector/Core/ConnectionPool.cs:line 107
at MysqLConnector.Core.ConnectionPool.GetSessionAsync(MysqLConnection connection,CancellationToken cancellationToken) in /_/src/MysqLConnector/Core/ConnectionPool.cs:line 137
at MysqLConnector.MysqLConnection.CreateSessionAsync(ConnectionPool pool,Nullable`1 ioBehavior,CancellationToken cancellationToken) in
/_/src/MysqLConnector/MysqLConnection.cs:line 863
at MysqLConnector.MysqLConnection.OpenAsync(Nullable`1 ioBehavior,CancellationToken cancellationToken) in /_/src/MysqLConnector/MysqLConnection.cs:line 414
at MysqLConnector.MysqLConnection.open() in /_/src/MysqLConnector/MysqLConnection.cs:line 380
at Microsoft.EntityFrameworkCore.ServerVersion.AutoDetect(String connectionString)
at NetCoreApp.API.Startup.<>c__displayClass4_0.<ConfigureServices>b__1(DbContextOptionsBuilder options) in C:\\Proyectos\\NetCoreApp\\NetCoreApp.API\\Startup.cs:line 40
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c__displayClass3_0`2.<AddDbContextPool>b__0(IServiceProvider _,DbContextOptionsBuilder ob)
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c__displayClass6_0`1.<AddPoolingOptions>b__0(IServiceProvider sp,DbContextOptionsBuilder ob)
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.CreateDbContextOptions[TContext](IServiceProvider applicationserviceProvider,Action`2 optionsAction)
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c__displayClass17_0`1.<AddCoreServices>b__0(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite,RuntimeResolverContext context) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite,TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.ResolveService(ServiceCallSite callSite,RuntimeResolverContext context,RuntimeResolverLock lockType,ServiceProviderEnginescope serviceProviderEngine)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite,RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite,TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite,ServiceProviderEnginescope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__displayClass1_0.<RealizeService>b__0(ServiceProviderEnginescope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType,ServiceProviderEnginescope serviceProviderEnginescope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEnginescope.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetrequiredService(IServiceProvider provider,Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetrequiredService[T](IServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c__17`1.<AddCoreServices>b__17_1(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite,TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitIEnumerable(IEnumerableCallSite enumerableCallSite,RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite,Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetrequiredService[T](IServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetServices[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.FindContextTypes()
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.FindContextType(String name)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.GetContextInfo(String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.GetContextInfoImpl(String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.GetContextInfo.<>c__displayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__displayClass3_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Access denied for user ''''@''fe80::45b2:4add:f2de:ebcf%6'' (using password: NO)
解决方法
我认为您遇到了空格问题。
去掉连接字符串中的空格。
示例:
servColl.AddDbContext<MyCoolDbContext>(options => options.UseMySql("server=localhost;database=library;user=mysqlschema;password=mypassword"));
开始工作。
THEN 强烈建议将连接字符串放在 appSettings.json 中
,我去掉了连接字符串中的空格并将连接字符串移到了配置中,但是出现了同样的错误。
这是我的代码:
启动:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1",new OpenApiInfo { Title = "NetCoreApp.API",Version = "v1" });
});
string mySqlConnectionStr = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContextPool<DataContext>(options => options.UseMySql(mySqlConnectionStr,ServerVersion.AutoDetect(mySqlConnectionStr)));
}
appsetting.json
{
"Logging": {
"LogLevel": {
"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"
},"ConnectionStrings": {
"DefaultConnection": "server=localhost;port=3306;database=alohatest;user=netcore;password=0yetcxeY7MzThobL;Persist Security Info=False;Connect Timeout=300"
}
},"AllowedHosts": "*"
}
.NET Core-EntityFrameworkCore-无法将类型为“ Query.Internal.EntityQueryable”的对象转换为类型为“ DbSet”的对象
如何解决.NET Core-EntityFrameworkCore-无法将类型为“ Query.Internal.EntityQueryable”的对象转换为类型为“ DbSet”的对象
我尝试在提供搜索字段时使用实体来实现搜索
但是我收到一个我不明白的奇怪的转换错误
Unable to cast object of type ''Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[SomeApp.Models.Partner]'' to type ''Microsoft.EntityFrameworkCore.DbSet`1[SomeApp.Models.Partner]''.
这是我的控制器入口点的代码
我尝试过强制转换,但显然我的代码有问题
[HttpPost]
public async Task<ActionResult<PartnersFetch>> GetPartners(PartneRSSearch partneRSSearch)
{
DbSet<Partner> data = _context.Partners;
if (partneRSSearch.SearchById != null)
{
// the following line causes problems :
data = (DbSet <Partner>) data.Where( p => p.Id == partneRSSearch.SearchById.GetValueOrDefault());
}
感谢您对此的帮助
解决方法
data.Where(...)
将返回一个IQueryable,您可以按如下方式实现
List<Partner> myResult = data.Where(...).ToList();
DbSet<Partner>
只是可以查询数据的集合。您的目标很可能是让合作伙伴摆脱困境,对吧?
我忘了使用AsQueryable
var data = _context.Partners.AsQueryable();
if (partnersSearch.SearchById != null)
{
data = data.Where( p => p.Id == partnersSearch.SearchById.GetValueOrDefault());
}
.NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记
29 | 定义仓储:使用EF Core实现仓储层
首先定义仓储层的接口,以及仓储层实现的基类,抽象类
仓储层的接口
namespace GeekTime.Infrastructure.Core
{
/// <summary>
/// 包含普通实体的仓储
/// 约束 TEntity 必须是继承 Entity 的基类,必须实现聚合根 IAggregateRoot
/// 也就是说仓储里面存储的对象必须是一个聚合根对象
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface IRepository<TEntity> where TEntity : Entity, IAggregateRoot
{
IUnitOfWork UnitOfWork { get; }
TEntity Add(TEntity entity);
Task<TEntity> AddAsync(TEntity entity, CancellationToken cancellationToken = default);
TEntity Update(TEntity entity);
Task<TEntity> UpdateAsync(TEntity entity, CancellationToken cancellationToken = default);
bool Remove(Entity entity);// 由于没有指定主键,只能根据当前实体进行删除操作
Task<bool> RemoveAsync(Entity entity);
}
/// <summary>
/// 包含指定主键的类型的实体的仓储
/// 继承了上面的接口 IRepository<TEntity>,也就是说拥有了上面定义的所有方法
/// 另外一个,它实现了几个跟 Id 相关的操作的方法
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TKey"></typeparam>
public interface IRepository<TEntity, TKey> : IRepository<TEntity> where TEntity : Entity<TKey>, IAggregateRoot
{
bool Delete(TKey id);
Task<bool> DeleteAsync(TKey id, CancellationToken cancellationToken = default);
TEntity Get(TKey id);
Task<TEntity> GetAsync(TKey id, CancellationToken cancellationToken = default);
}
}
具体抽象类的实现
namespace GeekTime.Infrastructure.Core
{
/// <summary>
/// 定义普通实体的仓储
/// 定义约束 TDbContext 必须是 EFContext,也就是仓储必须依赖于 EFContext 及其子类
/// 将来就可以把自己定义的比如 DomainContext 作为泛型参数传入 Repository,就可以很快捷地定义出来自己的仓储
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TDbContext"></typeparam>
public abstract class Repository<TEntity, TDbContext> : IRepository<TEntity> where TEntity : Entity, IAggregateRoot where TDbContext : EFContext
{
// 具体实现需要依赖 DbContext
protected virtual TDbContext DbContext { get; set; }
public Repository(TDbContext context)
{
this.DbContext = context;
}
public virtual IUnitOfWork UnitOfWork => DbContext;// 因为 DbContext, EFContext 实际上实现了 IUnitOfWork,所以直接返回
// 下面这些方法都是 EntityFramework 提供的能力,所以就能通过简单的几行代码来实现基本的仓储操作
public virtual TEntity Add(TEntity entity)
{
return DbContext.Add(entity).Entity;
}
public virtual Task<TEntity> AddAsync(TEntity entity, CancellationToken cancellationToken = default)
{
return Task.FromResult(Add(entity));
}
public virtual TEntity Update(TEntity entity)
{
return DbContext.Update(entity).Entity;
}
public virtual Task<TEntity> UpdateAsync(TEntity entity, CancellationToken cancellationToken = default)
{
return Task.FromResult(Update(entity));
}
public virtual bool Remove(Entity entity)
{
DbContext.Remove(entity);
return true;
}
public virtual Task<bool> RemoveAsync(Entity entity)
{
return Task.FromResult(Remove(entity));
}
}
/// <summary>
/// 定义主键的实体的仓储
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TDbContext"></typeparam>
public abstract class Repository<TEntity, TKey, TDbContext> : Repository<TEntity, TDbContext>, IRepository<TEntity, TKey> where TEntity : Entity<TKey>, IAggregateRoot where TDbContext : EFContext
{
public Repository(TDbContext context) : base(context)
{
}
/// <summary>
/// 根据 Id 从 DbContext 获取 Entity,然后再 Remove
/// 这样的好处是可以跟踪对象的状态
/// 坏处是任意的删除都需要先去数据库里面做查询
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Delete(TKey id)
{
var entity = DbContext.Find<TEntity>(id);
if (entity == null)
{
return false;
}
DbContext.Remove(entity);
return true;
}
public virtual async Task<bool> DeleteAsync(TKey id, CancellationToken cancellationToken = default)
{
var entity = await DbContext.FindAsync<TEntity>(id, cancellationToken);
if (entity == null)
{
return false;
}
DbContext.Remove(entity);
return true;
}
public virtual TEntity Get(TKey id)
{
return DbContext.Find<TEntity>(id);
}
public virtual async Task<TEntity> GetAsync(TKey id, CancellationToken cancellationToken = default)
{
return await DbContext.FindAsync<TEntity>(id, cancellationToken);
}
}
}
实现自己的 DbContext
DomainContext
namespace GeekTime.Infrastructure
{
public class DomainContext : EFContext
{
public DomainContext(DbContextOptions options, IMediator mediator, ICapPublisher capBus) : base(options, mediator, capBus)
{
}
public DbSet<Order> Orders { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region 注册领域模型与数据库的映射关系
modelBuilder.ApplyConfiguration(new OrderEntityTypeConfiguration());
modelBuilder.ApplyConfiguration(new UserEntityTypeConfiguration());
#endregion
base.OnModelCreating(modelBuilder);
}
}
}
映射关系,针对每一个领域模型创建一个 EntityTypeConfiguration
OrderEntityTypeConfiguration
namespace GeekTime.Infrastructure.EntityConfigurations
{
class OrderEntityTypeConfiguration : IEntityTypeConfiguration<Order>
{
public void Configure(EntityTypeBuilder<Order> builder)
{
// 定义主键
builder.HasKey(p => p.Id);
//builder.ToTable("order");
//builder.Property(p => p.UserId).HasMaxLength(20);
//builder.Property(p => p.UserName).HasMaxLength(30);
// 定义导航属性
builder.OwnsOne(o => o.Address, a =>
{
a.WithOwner();
//a.Property(p => p.City).HasMaxLength(20);
//a.Property(p => p.Street).HasMaxLength(50);
//a.Property(p => p.ZipCode).HasMaxLength(10);
});
}
}
}
UserEntityTypeConfiguration
namespace GeekTime.Infrastructure.EntityConfigurations
{
class UserEntityTypeConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(p => p.Id);
}
}
}
事务处理
要实现对 DomainContext 的事务处理的话,仅仅需要创建一个类 DomainContextTransactionBehavior
namespace GeekTime.Infrastructure
{
public class DomainContextTransactionBehavior<TRequest, TResponse> : TransactionBehavior<DomainContext, TRequest, TResponse>
{
public DomainContextTransactionBehavior(DomainContext dbContext, ICapPublisher capBus, ILogger<DomainContextTransactionBehavior<TRequest, TResponse>> logger) : base(dbContext, capBus, logger)
{
}
}
}
为了演示效果,在应用程序启动时,添加一行代码
Startup
// 这一行代码的作用是创建一个 Scope,在这个范围内创建 DomainContext
using (var scope = app.ApplicationServices.CreateScope())
{
var dc = scope.ServiceProvider.GetService<DomainContext>();
// 确定数据库已经创建,如果数据库没有创建,这个时候会执行数据库的自动创建过程,根据模型创建数据库
dc.Database.EnsureCreated();
}
数据库的注册部分
ServiceCollectionExtensions
/// <summary>
/// 这个定义就是将连接字符串配置到 dDomainContext
/// </summary>
/// <param name="services"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
public static IServiceCollection AddMySqlDomainContext(this IServiceCollection services, string connectionString)
{
return services.AddDomainContext(builder =>
{
builder.UseMySql(connectionString);
});
}
这一行代码的调用位置是在 ConfigureServices 里面
// 从配置中获取字符串
services.AddMySqlDomainContext(Configuration.GetValue<string>("Mysql"));
启动程序,运行过程中 EF 框架会根据定义的实体映射关系生成数据库,可在 Mysql 数据库中查看生成结果
接着丰富一下 Order 的映射关系
namespace GeekTime.Infrastructure.EntityConfigurations
{
class OrderEntityTypeConfiguration : IEntityTypeConfiguration<Order>
{
public void Configure(EntityTypeBuilder<Order> builder)
{
// 定义主键
builder.HasKey(p => p.Id);
builder.ToTable("order");// 修改表名为 order,不带 s
builder.Property(p => p.UserId).HasMaxLength(20);// 修改字段长度
builder.Property(p => p.UserName).HasMaxLength(30);
// 定义导航属性
// OwnsOne 的方式可以将 Address 这个值类型作为同一个表的字段来设置
builder.OwnsOne(o => o.Address, a =>
{
a.WithOwner();
a.Property(p => p.City).HasMaxLength(20);
a.Property(p => p.Street).HasMaxLength(50);
a.Property(p => p.ZipCode).HasMaxLength(10);
});
}
}
}
启动程序,可以看到数据库修改结果
这说明可以在仓储层定义领域模型与数据库的映射关系,这个映射关系可以组织为一个目录,为每一个领域模型设置一个类型来定义,并且这个过程是强类型的,这样的结构,便于后期维护
另外仓储层的话,定义了一个 IOrderRepository,仅仅实现了 IRepository 泛型接口,引进 Order,由于 Order 实际上有一个主键是 long,所以这里把主键类型也传给 IRepository
namespace GeekTime.Infrastructure.Repositories
{
public interface IOrderRepository : IRepository<Order, long>
{
}
}
Order
public class Order : Entity<long>, IAggregateRoot
这样子,Order 的仓储就定义完毕
那么 Order 仓储的实现也非常简单,仅仅需要继承 Repository,把 Order,long,DomainContext 传入泛型 Repository 即可,这里还实现了 IOrderRepository
namespace GeekTime.Infrastructure.Repositories
{
public class OrderRepository : Repository<Order, long, DomainContext>, IOrderRepository
{
public OrderRepository(DomainContext context) : base(context)
{
}
}
}
通过这样简单的继承,可以复用之前定义的代码,快速实现仓储层的定义
可以通过代码提升看到仓储层是有 Add,Update,Remove,Delete 方法,还有 UnitOfWork 的属性
这样一来就完成了仓储层的定义,可以看到仓储层的代码非常的薄,仅仅包含了一些接口的定义和类的继承,需要自定义一些方法的时候,可以在仓储层定义一些特殊方法,比如 AddABC 等特殊的逻辑都可以在这里去实现
namespace GeekTime.Infrastructure.Repositories
{
public class OrderRepository : Repository<Order, long, DomainContext>, IOrderRepository
{
public OrderRepository(DomainContext context) : base(context)
{
}
}
public void AddABC()
{
}
}
另外一个在组织领域模型和数据库的关系的时候,可以很清晰的看到,是在 EntityConfiguration 这个目录下面,为每一个模型定义一个映射类,当领域模型越来越复杂,数据库的结构越来越复杂的时候,这样的组织结构会非常的清晰
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="知识共享许可协议"src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a>
本作品采用<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET 框架 - NETFramework + API + EF(DBFirst) + MYSQL
.NET 框架 - NETFramework + MVC+ EF(DBFirst) + MYSQL
1. 安装 3 个 MYSQL 插件
①mysql-for-visualstudio-1.2.8 vs 的 mysql 工具 官网下载链接
②mysql-connector-net-6.10.8 注意版本号 必须与项目代码中的 MySql.Data.Entity 的版本保持一致,否则在实体选择的时候闪退 官网下载链接
③mysql-connector-odbc-5.3.10-winx64 odbc 链接驱动 官网下载地址
安装的时候选择全部安装,安装完成之后会在控制面板的程序里面有这个文件
2. 新建项目
3. 安装引用
在 NuGet 中
安装 EntityFrameWork
安装 mysql.Data 注意版本号 要一致 跟 connect/net 的版本保持一致
安装 Mysql.Data.Entity 也是一样 注意版本保持一致
install-package EntityFramework -version 6.2.0
install-package MySql.Data -version 6.10.8
install-package Mysql.Data.Entity -version 6.10.8
这样 4 个的 DLL,然后项目的配置到这边也 OK 了,接下来就是如果调用。很简单有木有。
4. 创建 DBFirst
用数据库 EF 设计器 DBFrist 模式
配置完成。
5. EF 操作数据
DBEntities DB = new DBEntities();
//查询
List<tbl_order> list = DB.tbl_order.Where(t => true).ToList();
//修改
list.ForEach(model =>
{
model.user_id = 55;
DB.Entry(model).State = System.Data.Entity.EntityState.Modified;
});
//删除
DB.tbl_order.Remove(list[0]);
//保存
DB.SaveChanges();
引用:https://www.cnblogs.com/DNLi/p/DNLi.html
今天的关于.net core 2.1 使用ef DBfirst 生成 实体映射遇到的坑 (Pomelo.EntityFrameworkCore.MySql 篇)的分享已经结束,谢谢您的关注,如果想了解更多关于.NET Core Pomelo Mysql 连接、.NET Core-EntityFrameworkCore-无法将类型为“ Query.Internal.EntityQueryable”的对象转换为类型为“ DbSet”的对象、.NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记、.NET 框架 - NETFramework + API + EF(DBFirst) + MYSQL的相关知识,请在本站进行查询。
本文标签: