今天继续学习EF,但是看来看去,实在是感觉不爽啊,因为你不知道源码里面到底是什么回事,我只能去猜去想象,要是有源码给我看几个单词也好啊。
百度吧。还是找到几篇博客,看上去不是很难弄。
https://www.cnblogs.com/michaellfx/p/3806857.html



这里要注意,我们只引入了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; }
}
配置如下
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);
}
}
查询数据,打印看看
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));
}
}
}
报错,找不到程序集

我们把源码中的这里改成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>
然后打印数据,出来了

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

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

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

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

原文:https://www.cnblogs.com/anyihen/p/12819406.html