Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

EF6学习笔记十五:调试EF框架源码

张四海 2019-01-20 23:20:00 阅读数:231 评论数:0 点赞数:0 收藏数:0

要专业系统地学习EF推荐《你必须掌握的Entity Framework 6.x与Core 2.0》。这本书作者(汪鹏,Jeffcky)的博客:https://www.cnblogs.com/CreateMyself/

今天继续学习EF,但是看来看去,实在是感觉不爽啊,因为你不知道源码里面到底是什么回事,我只能去猜去想象,要是有源码给我看几个单词也好啊。

百度吧。还是找到几篇博客,看上去不是很难弄。

https://www.cnblogs.com/michaellfx/p/3806857.html

先下载EF的源码: https://github.com/aspnet/EntityFramework6  我不知道这是6.几的版本,也不知道这是不是官方的
 
创建自己的控制台项目,引入两个程序集,并且控制台程序添加对这两个程序集的引用, 把这两个程序集的强签名去掉,重新生成解决方案

这里要注意,我们只引入了EntityFramework和EntityFramework.SqlServer,如果我们想要用数据迁移是不行的,可能要还要引入其他的程序集,我做了,没有成功。

所以,我们只能自己手动地去创建数据库,并且数据模型的配置也要写,并且你要保证你的配置和手写的数据库是完全匹配的。

你可以在另一个项目中把model、配置都写好,测试没问题,拿到这个项目中复制。

我的三个model

// 基类
public class BaseEntity
{
public BaseEntity()
{
this.Id = Guid.NewGuid().ToString();
this.AddTime = DateTime.Now;
}
public string Id { get; set; }
public DateTime AddTime { get; set; }
}
// 产品类
public class Order : BaseEntity
{
public string OrderNO { get; set; }
public string Description { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
// 产品类
public class Product : BaseEntity
{
public string Name { get; set; }
public decimal Price { get; set; }
public string Unit { get; set; }
public string FK_OrderId { get; set; }
public virtual Order Order { get; set; }
}
View Code

配置如下

public class EFDbContext:DbContext
{
public EFDbContext():base("name=ConnectionStr")
{
}
public DbSet<Order> Orders { get; set; }
public DbSet<Product> Products { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().ToTable("tb_Orders")
.HasKey(x => x.Id)
.HasMany(x => x.Products)
.WithRequired(x => x.Order)
.HasForeignKey(x => x.FK_OrderId);
modelBuilder.Entity<Product>().ToTable("tb_Products")
.HasKey(x => x.Id);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
}
}
View Code 

查询数据,打印看看

class Program
{
static void Main(string[] args)
{
// 忽略循环引用
JsonSerializerSettings set = new JsonSerializerSettings();
set.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
using (EFDbContext2 ctx = new EFDbContext2())
{
ctx.Database.Log = Console.WriteLine;
var res = ctx.Products.ToList();
Console.WriteLine(JsonConvert.SerializeObject(res,set));
}
}
}
View Code

报错,找不到程序集

 

我们把源码中的这里改成null

app.config配置文件中也改一下,pulicKeyToken改成null

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="ConnectionStr" connectionString="Data Source=LAPTOP-G81QJ856\SQLEXPRESS;Initial Catalog=_201901202.EFDbContext;Integrated Security=True" providerName="System.Data.SqlClient"></add>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>
View Code

 然后打印数据,出来了

这里要注意一个问题,EFDbContext中要一次性写好,不能运行了项目,再对EFDbContext进行改动,这样他会说你的文件改动要执行数据迁移,更新数据库。但是我们刚刚就强调了,只是引入了两个程序集,无法提供数据迁移的功能

我开始就是这样,EFDbContext中的配置没有写,可能是EF无法匹配到数据库,一直进行它的默认连接,即使我给他指定了连接字符串(我要求他连接到_201901202.EFDbContext这个数据库,但是我的配置和数据不匹配,他就连接默认数据库:命名空间+上下文类名)

然后我改好EFDbContext,以为这下终于万无一失,但是他说支持“EFDbContext”上下文的模型发生了更改。考虑使用代码优先迁移来更新数据库。可是我迁移用不了啊!

所以我又写了一个EFDbContext2,把代码复制过来,这样终于行了,连接到指定的数据源了。

 

版权声明
本文为[张四海]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/jinshan-go/p/10296665.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领