使用Entity Framework(4.3.1版本)遇到的问题整理

在这里记录一下之前使用Entity Framework(4.3.1版本)遇到的问题。
更新没有设置主键的表
在默认情况下,EF不能对一个没有主键的表进行更新、插入和删除的动作。用xml方式查看edmx文件,可以在SSDL中可以看到如下xml片断(我定义了一个没有主键的表tb_WithoutKey)。


代码如下:

<EntitySet Name="tb_WithoutKey" EntityType="TransferModel.Store.tb_WithoutKey" store:Type="Tables" store:Schema="dbo" store:Name="tb_WithoutKey">
<DefiningQuery>
SELECT
[tb_WithoutKey].[ID] AS [ID],
[tb_WithoutKey].[Name] AS [Name]
FROM [dbo].[tb_WithoutKey] AS [tb_WithoutKey]
</DefiningQuery>
</EntitySet>

我再加入一个有主键的表进行对比,同样的在SSDL中,可以看到有主键的表的定义如下。


代码如下:

<EntitySet Name="tb_WithKey" EntityType="TransferModel.Store.tb_WithKey" store:Type="Tables" Schema="dbo" />

我们把没有主键的<EntitySet>照着上面这个节点进行更改:删除<DefiningQuery>节点,将store:Schema=”dbo”更改为Schema=”dbo”。这样我们就可以对之前没有设置主键的表进行更新、删除以及插入操作了。
无主键的表SSDL定义其实更像是视图,我有一点不明的是store:这个命名空间的作用是什么,为什么只是删除<DefiningQuery>不行,还需要将Schema属性的store命名空间删除才可以。以上都是我还不明白的地方,只是作为一个解决方案,它确实简单可行。
更改Code-First的默认连接
我们知道使用Code-First的时候我们甚至可以不用写连接字符串,但是这个默认的连接只识别本机的SQL Express版数据库,如果你是使用其它数据库甚至就是Sql Server非Express版,都不行。
在不提供任何连接数据库信息的情况下,EF会创建一个默认的DefaultConnectionFactory,这个默认的连接工厂使用的就是SqlConnectionFactory,然后我们可以通过reflector看到它的构造函数如下。
public SqlConnectionFactory()
{
this._baseConnectionString = @"Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True";
}
所以说EF默认只能连Sql Express版的数据库。SqlConnectionFactory提供一个构造函数重载,可以指定连接字符串,修改默认的数据库连接,我们可以在配置文件中添加以下节点进行配置。


代码如下:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=heqichang-pc; Integrated Security=True; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>
</entityFramework>

不过不管怎样,我觉得还是指定好连接字符串来开发比较好,排除各种不可控的因素。
检测字符串截断错误
有时使用EF的时候会出现像以下这样的错误。
 
产生这个错误的原因一般都是数据库里设置的字段长度小于你插入的新数据的长度。但是知道原因,要知道具体是哪个字段的长度超出范围了却比较困难了,EF给出的信息也不明确,当然,如果数据库中的字段少,可以很快筛选出来,但是如果表中的字段非常多,那就麻烦了。这个时候我们就可以用到SQL Server自带的SQL Server Profiler这个工具了(Express版没有这个工具)。
假设我有个tb_Test表,里面有个Name字段,类型为varchar(10)。在运行我们错误的程序前,先开启Profiler,选择好你连接的数据库开始监控。最后就可以看到我们错误的SQL语句了。
 
这个工具可以方便的监控到EF运行时对数据库的操作,注意上图,该工具会自动分辨出这是来自Entity Framework的请求,然后下边是具体的SQL语句。
以上只是我上两周使用EF时实际遇到的问题总结,在实际中绝对不止上述我遇到的这些问题,欢迎各位园友多多提出哈!

(0)

相关推荐

  • 详解如何在ASP.NET Core中应用Entity Framework

    首先为大家提醒一点,.NET Core和经典.NET Framework的Library是不通用的,包括Entity Framework! 哪怎么办? 别急,微软为.NET Core发布了.NET Core版本的Entity Framework,具体配置方法与经典.NET Framework版本的稍有区别,下面的内容就为带领大家在ASP.NET Core中应用Entity Framework DB first. 注:目前部分工具处于Preview版本,正式版本可能会稍有区别. 前期准备: 1.推

  • 扩展 Entity Framework支持复杂的过滤条件(多个关键字模糊匹配)

    之前遇到一个棘手的Linq to EF查询的技术问题,现有产品表Product,需要根据多个关键字模糊匹配产品名称, 现将解决方案分享出来. 问题描述 根据需求,我们需要编写如下的SQL语句来查询产品 复制代码 代码如下: select * from dbo.Product where (ProductName like 'Product1%' or ProductName like 'Product2%') 如何将以上的SQL语句转换成EF的写法呢? 方案一 可以使用Union,将以上SQL语

  • NopCommerce架构分析之(三)EntityFramework数据库初试化及数据操作

    系统启动时执行任务:IStartupTask,启动时执行的任务主要是数据库的初始化和加载. IStartupTask调用IEfDataProvider进行数据库的初始化. IEfDataProvider,SqlCeDataProvider:获取数据连接工厂,不同类型数据库,连接工厂不同. 接口IStartupTask的实体类EfStartUpTask的实现如下: public class EfStartUpTask : IStartupTask { public void Execute() {

  • Entity Framework之DB First方式详解

    EF(Entity Framework的简称,下同)有三种方式,分别是:DataBase First. Model First和Code First. 下面是Db First的方式: 1. 数据库库中存在两个表,一个是专业表,一个学生表,一个学生只能属于一个专业: 其中T_Major是专业表,T_Student是学生表,StudentId是学号,MajorId是专业Id,T_Major与T_Student是一对多的关系. 2. 项目中添加数据库实体模型 因为之前没有配置过数据库连接,所以点击"新

  • C# Entity Framework中的IQueryable和IQueryProvider详解

    前言 相信大家对Entity Framework一定不陌生,我相信其中Linq To Sql是其最大的亮点之一,但是我们一直使用到现在却不曾明白内部是如何实现的,今天我们就简单的介绍IQueryable和IQueryProvider. IQueryable接口 我们先聊聊这个接口,因为我们在使用EF中经常看到linq to sql语句的返回类型是IQueryable,我们可以看下这个接口的结构: 复制代码 代码如下: public interface IQueryable : IEnumerab

  • 使用Entity Framework(4.3.1版本)遇到的问题整理

    在这里记录一下之前使用Entity Framework(4.3.1版本)遇到的问题. 更新没有设置主键的表 在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作.用xml方式查看edmx文件,可以在SSDL中可以看到如下xml片断(我定义了一个没有主键的表tb_WithoutKey). 复制代码 代码如下: <EntitySet Name="tb_WithoutKey" EntityType="TransferModel.Store.tb_WithoutK

  • Entity Framework系统架构与原理介绍

    一.Entity Framework概要 Entity Framework是微软的Object Relational Mapper(对象关系映射),也就是我们平常说的ORM,它可以让应用程序开发者将关系型数据作为业务模型来使用,也消除了开发者为数据访问编写的绝大多数管道代码的需要(比如使用ADO.NET).Entity Framework提供了一个综合的.基于模型的系统,通过摆脱为所有的领域模型编写相似的数据访问代码,使得开发者创建数据访问层是如此之简单.Entity Framework的首发版

  • Entity Framework Core延迟加载(懒加载)用法

    众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载.不过现在EF Core的开发团队打算恢复对这一功能的支持(目前还未发布,不过可以在Github上面下载进行测试). 懒加载 懒加载也可以叫做按需加载.延迟加载.可以分两方面来理解,一方面指暂时不需要该数据,不用在当前马上加载,而可以推迟到使用它时再加载:另一方面指不确定是否将会需要该数据,所以暂时请不要加载,待确定需要后再加载它.懒加

  • Entity Framework实现数据迁移

    一.合并和迁移 1.合并 合并是指“新的实体模型映射到数据库中,更新其结构”,例如:新增了实体类,表现在数据库中就是新增加实体类对应的数据表.删除了实体类,表现在数据库中就是删除了实体类对应的数据表.在一个已经存在的实体类中增加属性,表现在数据库中就是在实体类对应的数据表中新增加字段.在一个已经存在的实体类中删除属性,表现在数据库中就是在实体类对应的数据表中删除字段.修改一个已经存在的实体类中属性的名称或类型,表现在数据库中就是修改实体类对应的数据表中字段的名称或类型. 2.迁移 迁移是指“在更

  • Entity Framework使用Code First模式管理事务

    一.什么是事务 处理以数据为中心的应用时,另一个重要的话题是事务管理.ADO.NET为事务管理提供了一个非常干净和有效的API.因为EF运行在ADO.NET之上,所以EF可以使用ADO.NET的事务管理功能. 当从数据库角度谈论事务时,它意味着一系列操作被当作一个不可分割的操作.所有的操作要么全部成功,要么全部失败.事务的概念是一个可靠的工作单元,事务中的所有数据库操作应该被看作是一个工作单元. 从应用程序的角度来看,如果我们有多个数据库操作被当作一个工作单元,那么应该将这些操作包裹在一个事务中

  • Entity Framework Core使用控制台程序生成数据库表

    目录 一.引言 1.添加实体类 2.添加Mircosoft.EntityFrameworkCore 二.生成数据库表 1.代码生成 2.程序包管理器控制台迁移 1.安装Microsoft.EntityFrameworkCore.Tools包 2.添加迁移 3.更新数据库 3.命令行迁移 一.引言 我们使用Code First的方式来生成数据库表,我们先讲解如何在控制台项目中生成数据库表. 在前面的文章中,我们是直接在控制台项目中安装的Mircosoft.EntityFrameworkCore,在

  • Entity Framework Core相关包的概念介绍与安装

    一.引言 我们以Entity Framework Core 最新版本3.1.1进行讲解,在正式的学习之前,我们第一步是要使用EF Core中的安装包,这时候需要明确的知道到底需要安装哪些包,我们下面先来讲解EF Core中需要使用到的一些包. 二.相关包极其概念 1.Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore:Entity Framework Core is a lightweight and extensible ve

  • Entity Framework Core种子数据Data-Seeding

    目录 一.什么是Data-Seeding 二.初始化方法 1.模型中配置 2.手动迁移时添加 3.自定义初始化逻辑 三.Data-Seeding本质 1.首次迁移 2.修改不是主键的数据 3.删除数据 4.修改主键数据 四.总结 一.什么是Data-Seeding Data-Seeding是EntityFrameworkCore 2.1以上版本新增加的特性.在项目刚开始的时候,我们往往是需要初始化一些基础数据到数据库中,通过Data-Seeding特性就可以实现这一功能.本篇文章我们将讲解如何进

  • Entity Framework Core基于数据模型创建数据库

    1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序.使用迁移(Migrations)基于数据模型创建数据库,你可以在Windows上使用Visual Studio 2017 PowerShell或在Windows.macOS或Linux上使用.NET Core CLI来学习创建数据库. 2.创建新项目 2.1系统必备 在创建新项目之前都要检查是否安装以下软件:●具有以下工作负载的Visual Studio 2017 15.7版或

随机推荐