使用实体框架4.1代码优先于模型/数据库优先使用EDMX图表有什么优缺点?
我正在尝试完全理解使用EF 4.1构建数据访问层的所有方法.我正在使用Repository模式和IoC.
我知道我可以使用代码优先方法:手动定义我的实体和上下文并用于ModelBuilder微调模式.
我还可以创建一个EDMX图表并选择一个代码生成步骤,该步骤使用T4模板生成相同的POCO类.
在这两种情况下,我最终POCO都得到了ORM不可知的对象和源自的上下文DbContext.
数据库优先似乎最吸引人,因为我可以在企业管理器中设计数据库,快速同步模型并使用设计器对其进行微调.
那么这两种方法有什么区别?是仅仅关于VS2010与企业管理器的偏好?
entity-framework poco ef-code-first entity-framework-4.1 ef-database-first
我正在尝试使用EF6更新记录.首先找到记录,如果存在,则更新它.这是我的代码: -
var book = new Model.Book
{
BookNumber = _book.BookNumber,
BookName = _book.BookName,
BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
if (result != null)
{
try
{
db.Books.Attach(book);
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
每次我尝试使用上面的代码更新记录时,我收到此错误: -
{System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:存储更新,插入或删除语句影响了意外的行数(0).自实体加载后,实体可能已被修改或删除.刷新ObjectStateManager entrie
是否可以将新的Asp.net标识与Database First和EDMX一起使用?或者只使用代码?
这是我做的:
1)我创建了一个新的MVC5项目并让新的Identity在我的数据库中创建了新的User和Roles表.
2)然后我打开了我的Database First EDMX文件并拖入了新的Identity Users表,因为我有其他与之相关的表.
3)保存EDMX后,Database First POCO生成器将自动创建User类.但是,UserManager和RoleManager需要从新的Identity命名空间(Microsoft.AspNet.Identity.IUser)继承User类,因此使用POCO User类将不起作用.
我想一个可能的解决方案是编辑我的POCO生成类以使我的User类继承自IUser?
或者ASP.NET Identity仅与Code First Design兼容?
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
更新:根据Anders Abel的建议,这就是我所做的.它的工作原理,但我想知道是否有更优雅的解决方案.
1)我通过在与自动生成的实体相同的命名空间中创建一个部分类来扩展我的实体User类.
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
Run Code Online (Sandbox Code Playgroud)
2)我将DataContext更改为继承IdentityDBContext而不是DBContext.请注意,每次更新EDMX并重新生成DBContext和Entity类时,都必须将其设置为此.
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
Run Code Online (Sandbox Code Playgroud)
3)在自动生成的User实体类中,必须将override关键字添加到以下4个字段中,或者将这些字段注释掉,因为它们是从IdentityUser继承的(步骤1).请注意,每次更新EDMX并重新生成DBContext和Entity类时,都必须将其设置为此.
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }
Run Code Online (Sandbox Code Playgroud) asp.net asp.net-mvc ef-database-first asp.net-mvc-5 asp.net-identity
使用EF 6.1,MVC 5,VS 2013,C#
我有一个在Toad DM for SQL Server中设计的现有数据库模型,并且保持它始终更新非常重要
使用ADO.NET实体数据模型我从数据库中选择Code First(EF 6.1中的新功能)来生成模型.注意:模型类和DbContext类成功生成但生成了NO .edmx或.tt文件.
接下来,我使用Entity Framework添加了一个新的脚手架项:带有视图的MVC 5控制器.注意:生成成功,控制器和视图
从现在开始,我不想使用Code First来更新我的数据库.相反,我希望根据数据库更改来更新模型.接下来做什么?如果我没有edmx文件,我将无法从数据库更新我的模型类?
c# ef-code-first ef-database-first entity-framework-6 asp.net-mvc-5
我们正在使用Entity Framework 6.0.0并首先使用数据库(像这样)从表和存储过程生成代码.这似乎很有效,除了在更新或刷新模型时不反映存储过程的更改.反映了向表中添加列,但未向存储过程添加字段.
有趣的是,如果我转到Model Browser,右键单击存储过程,选择Add Function Import并单击按钮,Get Column Information我们可以看到正确的列.这意味着模型知道列,但无法更新生成的代码.
有一种解决方法,即在更新模型之前删除生成的存储过程.只要您没有对存储过程进行任何编辑,这就可以工作.有谁知道避免这种解决方法的方法?
Visual Studio 2013截至2013年12月初,我正在使用所有最新更新.
提前致谢!
更新1: andersr的回答有助于一个案例,其中存储过程使用临时表,所以我给了他+1,但它仍然无法解决更新简单存储过程的主要问题.
更新2: shimron的评论下面链接到关于EF 3.5中相同问题的问题.对于EF 6.0来说,似乎仍然如此.阅读它是为了另一种方法,但我现在的结论是,最简单的方法是在更新模型之前删除生成的存储过程.如果你想做一些奇特的事情,可以使用部分课程.
stored-procedures entity-framework ef-database-first entity-framework-6 visual-studio-2013
在将项目从使用Entity Framework 5升级到Entity Framework 6之后(虽然NuGets更新功能)我在生成的Entities类上收到以下错误:
错误1命名空间"System.Data"中不存在类型或命名空间名称"Objects"
(您是否缺少程序集引用?)
我知道这是因为命名空间已经改变,我可以通过更改我的导入来手动修复错误:
using System.Data.Objects;
和using System.Data.Objects.DataClasses;
To:
using System.Data.Entity.Core.Objects;
但是生成文件所以我需要在每次之后重新应用此修复程序Update model from Database.有没有额外的东西可以让EF生成没有这个错误的模型.
c# entity-framework ef-database-first entity-framework-5 entity-framework-6
我首先使用Entity Framework 5,DB.我知道如何在我的模型上定义枚举,并将字段的类型设置为该枚举.
现在,我需要将字段映射MyField到外部定义的枚举,即不在EF模型(OtherNamespace.MyEnum)中.设计者不允许我将类型设置为模型之外的任何类型.我尝试手动编辑edmx文件,但这会导致错误:
错误10016:解析项目"MyField"时出错.异常消息是:'Unresolved reference'Othercomspace.MyEnum'.'.
OtherNamespace.MyEnum 由我的项目引用.
你怎么做呢?
我们有一个数据库,其中一个表包含可以是其他几个表的子记录.它有一个"软"外键,由所有者的Id和表名组成.这种(反)模式被称为"多态关联".我们知道它不是有史以来最好的数据库设计,我们会在适当的时候改变它,但不会在不久的将来改变它.让我举一个简化的例子:

两者Event,Person并Product在评论中有记录.如您所见,没有严格的FK约束.
在实体框架可以通过sublassing支持这种模式Comment进入EventComment等,让Event有EventComments收集等:

从数据库生成基本模型后,手动添加子类和关联.OwnerCode是这个TPH模型中的鉴别器.请注意Event,Person和Product完全不同的实体.为它们建立一个公共基类是没有意义的.
这是数据库优先的.我们的现实模型就是这样,没问题.
好.现在我们想要转向代码优先.所以我开始将数据库逆向工程化为代码优先模型(EF Power Tools),然后继续创建子类并映射关联和继承.试图连接到Linqpad中的模型.那是麻烦开始的时候.
当尝试使用此模型执行查询时,它会抛出一个 InvalidOperationExeception
外键组件"OwnerId"不是"EventComment"类型的声明属性.验证它是否未从模型中明确排除,并且它是有效的原始属性.
当我有双向关联并被OwnerId映射为属性时会发生这种情况Comment.我的EventMapclass(EntityTypeConfiguration<Event>)中的映射如下所示:
this.HasMany(x => x.Comments).WithRequired(c => c.Event)
.HasForeignKey(c => c.OwnerId);
Run Code Online (Sandbox Code Playgroud)
所以我尝试OwnerId在模型中映射关联:
this.HasMany(x => x.Comments).WithRequired().Map(m => m.MapKey("OwnerId"));
Run Code Online (Sandbox Code Playgroud)
这引发了一个 MetaDataException
指定的架构无效.错误:(10,6):错误0019:类型中的每个属性名称必须是唯一的.已定义属性名称"OwnerId".(11,6):错误0019:类型中的每个属性名称必须是唯一的.已定义属性名称"OwnerId".
如果我删除三个实体注释关联中的两个,那就没关系,但当然这不是治愈方法.
更多细节:
EdmxWriter)时,关联似乎在存储模型中,而在原始edmx中,它们是概念模型的一部分.那么,我该如何创建这个模型代码呢?我认为关键是如何指导代码优先映射概念模型中的关联,而不是存储模型.
c# foreign-keys ef-code-first ef-database-first entity-framework-5
我试图在我的MVC 4中第一次使用SimpleMembership,我已经有了一个基于它的现有数据库和EF5模型!我搜索了很多,但我无法找到如何在我的情况下使用它,并在我自己的模型下拥有一切.
如果有人能让我知道如何做到这一点会很棒.
谢谢
ef-database-first asp.net-mvc-4 sql-server-2012 entity-framework-5 simplemembership
在设计器上使用Database First方法使用EF 5时,我遇到了一个奇怪的错误.错误是说'value not not null parameter name:font'.我在设计区域也得到一个大的红色X. 我不确定设计师是如何产生这个错误的,到目前为止,我只是使用设计器来创建我的edmx.
思考?这是VS 2012 RTM版本.