我有基于EF Code First的模型,我想将它们与默认的MembershipProvider一起使用,但我不知道如何正确编写模型,所以当有更改时,它不会删除重新创建表的所有数据到模型.
将域对象与任何类型的持久性代码完全分离的能力使系统更具可扩展性和可维护性.当业务逻辑可以与存储代码分开测试时,测试变得更加容易.将POCO与实体框架(EF)一起使用肯定是朝着正确方向迈出的一步:)
有两种类型的使用poco与EF 1.使用实体设计师2.仅使用代码
哪一个是最好的方法EF poco代码首先或EF Poco使用实体数据模型设计师?
谢谢
我遇到过一个案例,其中与LINQ to SQL相当不错的东西似乎对Entity Framework来说非常迟钝(或者可能是不可能的).具体来说,我有一个包含rowversion属性的实体(用于版本控制和并发控制).就像是:
public class Foo
{
[Key]
[MaxLength(50)]
public string FooId { get; set; }
[Timestamp]
[ConcurrencyCheck]
public byte[] Version { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望能够将实体作为输入,并找到最近更新的所有其他实体.就像是:
Foo lastFoo = GetSomeFoo();
var recent = MyContext.Foos.Where(f => f.Version > lastFoo.Version);
Run Code Online (Sandbox Code Playgroud)
现在,在数据库中,这将起作用:两个rowversion值可以相互比较而没有任何问题.在使用LINQ to SQL之前我做了类似的事情,它映射了rowversionto System.Data.Linq.Binary,可以进行比较.(至少在表达式树可以映射回数据库的程度上.)
但在Code First中,属性的类型必须是byte[].并且两个数组无法与常规比较运算符进行比较.有没有其他方法来编写LINQ to Entities将理解的数组的比较?或者将数组强制转换为其他类型,以便比较可以通过编译器?
我已经通过Nuget将EF 5添加到我的项目中,并使用"Enable-Migrations"命令启用了迁移.然后我调用"Add-Migration"来生成用于生成模式的基本代码.
然后我向我的一个域对象添加了一个属性(名为"TestProperty"的字符串属性)并添加了一个映射到我的EntityTypeConfiguration文件(我们暂时忽略了这些约定).
再次调用"Add-Migration"会产生错误:
Unable to generate an explicit migration because the following explicit migrations are pending: [201303262144218_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration.
Run Code Online (Sandbox Code Playgroud)
但是调用"Update-Database"会产生一个sql异常,因为这些表已经存在:
There is already an object named 'Customer' in the database
Run Code Online (Sandbox Code Playgroud)
在我的DbContext的构造函数中,我尝试了不同的更新策略,例如:
Database.SetInitializer<UnitOfWork>(new DropCreateDatabaseAlways<UnitOfWork>());
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗 我在这里尝试了解决方案,但它不起作用:ASP.NET的自动迁移
谢谢
编辑:更新完成第一步的关键是创建初始迁移,然后从Up和Down方法中删除生成的代码(http://thedatafarm.com/blog/data-access/using-ef-migrations- with-an-existing-database /).
然后,我可以更新模型和EF映射,然后运行Add-Migration.这会使用正确的Up和Down代码生成迁移.
然后问题是尝试应用更新.Update-Database产生错误"无法更新数据库以匹配当前模型,因为存在挂起的更改并禁用自动迁移...自动迁移.将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移.您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移".好的,所以我再次尝试添加迁移,它会生成另一个迁移,其代码与最后一个完全相同.
我运行Update-Database并再次获得相同的错误.我尝试"Update-Database -TargetMigration 201304080859556_MyMigration -Force",但这会产生"指定的目标迁移'201304080859556_MyMigration'不存在.确保目标迁移是指现有的迁移ID" - 确实如此!
很沮丧!
entity-framework code-migration ef-code-first entity-framework-5
我知道我可以为每个属性添加一个数据注释来设置它的列类型VARCHAR但是我有数百个列我想要VARCHAR而不是NVARCHAR有一些方法来设置EF6使其成为默认值吗?
每当我尝试添加带有Entity框架模板的控制器时,我都会收到一条消息错误,但我一直收到错误消息
unable to retrieve metadata for 'path' unrecognized element providers.
(C:\Users\user\appdata\local\Temp-mp6124.tmp line 78)
Run Code Online (Sandbox Code Playgroud)
我知道它与连接字符串有关,所以这是我的连接字符串
<connectionStrings>
<add name="NoktatyContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=NoktatyContext-20140122154208; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|NoktatyContext-20140122154208.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud) entity-framework connection-string database-connection ef-code-first asp.net-mvc-4
我Seed在Configure.cs为我的实体框架6代码优先迁移过程中的方法中遇到了问题.我正在运行该Update-Database -verbose命令Package Manager Console,并尝试在Seed方法的c#代码中设置断点(在VS studio web express 2013中).但即使我把它放在方法的第一个语句中,它也没有被击中,虽然控制台显示running seed method(并且由于我的错误而导致其中断)
那么可以以某种方式在Seed方法中设置断点吗?如果没有,调试该代码的最佳方法是什么?
我有一个现有的表/模型,我想删除一个新的布尔列.该表已有数百行数据,我无法触及现有数据.但是..这个列不可为空,所以我需要为true当前存在的所有行提供默认值.
public class Revision
{
...
public Boolean IsReleased { get; set; }
....
}
Run Code Online (Sandbox Code Playgroud)
重要:
(这是在OP,但人们似乎错过了.)
使用迁移更新数据库时,接收此新列的所有现有行必须将其值设置为True.
我在实体框架代码优先查询中遇到了一些性能问题,我相信预编译可能就是答案.如果我使用"普通"实体框架,我只需使用CompiledQuery.Compile方法预先查询我的查询.但由于我有一个DbContext而不是ObjectContext,我无法让它工作.
我确实认识到DbContext是一个IObjectContextAdapter,它允许我访问ObjectContext,但我找不到让我从我的预编译查询中运行的对象上下文中获取IQueryable的方法.我试图使用CreateObjectSet,但是当EF试图运行查询时,它抱怨它无法将该方法转换为SQL.
那么针对Code-First DbContext预编译LINQ查询的最佳方法是什么?
我正在使用代码优先方法开发mvc 5应用程序.
我正面临一个问题.在我第一次尝试下面的命令时,它在该数据库中工作并生成表.但是当我更改了一些类,然后尝试了前2个查询时,它就适用于那种情况但是当我尝试第三个命令时,它给了我这个消息.
First step ========== enable-migrations -ContextTypeName IdentityDb -MigrationsDirectory DAL\IdentityMigrations enable-migrations -ContextTypeName SMSContext -MigrationsDirectory DAL\SMSMigrations Second Step =========== add-migration -ConfigurationTypeName SMSApp.DAL.IdentityMigrations.Configuration "InitialCreate" add-migration -ConfigurationTypeName SMSApp.DAL.SMSMigrations.Configuration "InitialCreate" Third Step ========== update-database -ConfigurationTypeName SMSApp.DAL.IdentityMigrations.Configuration -verbose update-database -ConfigurationTypeName SMSApp.DAL.SMSMigrations.Configuration -verbose
看到第一个错误:
PM> add-migration -ConfigurationTypeName SMSApp.DAL.IdentityMigrations.Configuration "InitialCreate"
Scaffolding migration ' '.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next …Run Code Online (Sandbox Code Playgroud)