最近用EntityFramework 4.1把Petshop4.0做了改写.替换掉Model和DAL层.
用的是Update Model From Database, 把碰到的问题列出来备忘:
1. 用Partial Class 把类分开,在db有对应字段的放在EDMX文件里;例如订单总额这种统计数据就放到单独的cs文件.
2. EF自带有缓冲,如果get By Primary Key的记录,用这样的写法会快些
{
EntityKey key = new EntityKey("MSPetShop4Entities.Categories", "CategoryId", categoryId);
return ctx.GetObjectByKey(key) as Category;
}
并要引用C:\Program Files\Microsoft ADO.NET Entity Framework 4.1\Binaries\EntityFramework.dll
{
return ctx.Orders.Include("LineItems").Where(t => t.OrderId.Equals(orderId)).FirstOrDefault();
}
4.如何直接写sql?
从函数名不难知道,前者是为了执行某一并无返回集的SQL 命令,例如UPDATE,DELETE操作;
后者是执行某一个查询,并可以将返回集转换为某一对象(这个对象必须是EDMX文件里面定义的)
如果是自己定义的view或class,就得用linq自己转换了.
where t.Profile.Username.Equals(userName) && t.Profile.ApplicationName.Equals(appName)
select new AddressInfo()
{
Email = t.Email,
FirstName = t.FirstName,
LastName = t.LastName,
Address1 = t.Address1,
Address2 = t.Address2,
City = t.City,
State = t.State,
Zip = t.Zip,
Country = t.Country,
Phone = t.Phone
};
5. 如果db没有定义primary key,保存记录时就会出现错误
exists in the <ModificationFunctionMapping> element to support the current operation
解决办法如下:
http://stackoverflow.com/questions/1589166/it-has-a-definingquery-but-no-insertfunction-element-err
6. 如何跨数据库访问.
先在其中一个数据库添加"同义词" synonym, 然后再新建一个View包含该synonym, 再在EDMX文件里定义该View.
7.EF4.1新的API,DbSet<>.Find()。
过去我们常常用Where或First(FirstOrDefault)方法来查找对应的实体,比如:
where p.Name.StartsWith("M")
select u;
var people = context.People.FirstOrDefault(p => p.Name == "Michael");
这样查找的缺点是:即使我们相应的实体已经被ObjectContext缓存,EF还是会去执行数据库访问,而数据库访问是被普遍认为比较耗费性能的。
EF4.1为我们提供了一个新的API: DbSet<>.Find()。它可以帮助我们通过主键来查找对应的实体。并且如果相应的实体已经被ObjectContext缓存,EF会在缓存中直接返回对应的实体,而不会执行数据库访问。
比如我们查找主键PersonID为1的Person实体:
var person = context.People.Find(1);
也可用于联合主键(比如查找主键PersonID=1, PersonName="Michael"的实体):
注意:此处输入联合主键的次序需要按照我们定义改实体类时声明主键的次序。
和之前直接用Where或First的调用不同,Find函数对于刚刚新增的实体也能找到:
{
context.People.Add(new People { PersonID = 100 });
var newPerson = context.People.Find(100);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?