我最近从MSDN升级到Visual Studio 2012 RTM Ultimate.我正在使用EF Code First Migrations在我的应用程序中构建我的数据库,最近我添加了一个新实体,并希望为它进行迁移.
为此,您需要在VS中打开"包管理控制台"窗口,然后键入add-migration "some name here".这将自上次更新以来对数据库进行任何更改.
VS 2012 RC上未发生此问题
我遇到的问题是,尽管我的解决方案中有多个项目,但未填充程序包管理器控制台中的"默认项目"下拉列表.我在上面输入命令时使用的默认项目是错误的项目(我的迁移在另一个项目中).我这样做时收到以下错误:
在程序集"ProjectA"中未找到任何迁移配置类型.(在Visual Studio中,您可以使用程序包管理器控制台中的"启用 - 迁移"命令添加迁移配置).

我已经尝试将正确的项目(ProjectB)设置为启动项目,只是为了得到这个错误:
无法加载程序集"ProjectA".(如果在Visual Studio中使用Code First Migrations,如果解决方案的startUp项目未引用包含迁移的项目,则可能会发生这种情况.您可以更改解决方案的startUp项目或使用-StartUpProjectName参数.)
如何手动指定要添加的项目迁移,或强制"默认项目"下拉列表填充?
我已经使用了Find(id)与实体框架5.但是集合扩展方法,很多的例子我看到的使用Where(s => s.Id == 1),而我加入FirstOrDefault()来获取对象,而不是一个集合.这是一种风格差异,还是有明显的.Where()偏好的功能原因?
.net linq linq-to-entities entity-framework entity-framework-5
我正在寻找一种在TransactionScope处于活动状态时执行查询的方法,并忽略TransactionScope - 基本上,我想执行此特定查询,无论如何.
我使用EF代码优先,以及应用程序的设计方式,一个新的数据上下文贯穿单个呼叫多次打开,每一个都有自己的变化,所有这些都包含在一个单一的TransactionScope,这已经内Complete()称为最后假设没有失败.在上下文中我们已经重写,SaveChanges以便如果发生任何异常base.SaveChanges(),我们可以捕获它并在回滚事务之前登录到数据库.
由于在SaveChanges事务内部发生,因此记录显然不会发生,因为它属于与原始调用相同的事务.我试图完全忽略TransactionScope的日志代码.
这是一些精简代码:
// From the context
public override int SaveChanges() {
try {
return base.SaveChanges();
} catch (Exception ex) {
// Writes to the log table - I want this to run no matter what
LogRepo.Log(/*stuff to log from the context*/);
throw;
}
}
// Inside the business logic
public void DoSomething() {
try {
using (var scope = new TransactionScope()) {
using (var context = new FooContext()) …Run Code Online (Sandbox Code Playgroud) c# entity-framework transactions transactionscope entity-framework-5
对于未来的访问者:对于EF6,您可能最好使用过滤器,例如通过此项目:https://github.com/jbogard/EntityFramework.Filters
在我们正在构建的应用程序中,我们应用"软删除"模式,其中每个类都有一个'已删除'布尔.实际上,每个类都只是继承自这个基类:
public abstract class Entity
{
public virtual int Id { get; set; }
public virtual bool Deleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
举一个简短的例子,假设我有类GymMember和Workout:
public class GymMember: Entity
{
public string Name { get; set; }
public virtual ICollection<Workout> Workouts { get; set; }
}
public class Workout: Entity
{
public virtual DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我从数据库中获取健身房成员列表时,我可以确保没有获取任何"已删除"健身房成员,如下所示:
var gymMembers = context.GymMembers.Where(g => !g.Deleted);
Run Code Online (Sandbox Code Playgroud)
然而,当我遍历这些健身房成员时,他们Workouts从数据库加载而不考虑他们的Deleted旗帜.虽然我不能责怪实体框架没有理解这一点,但我想以某种方式配置或拦截延迟属性加载,以便永远不会加载已删除的导航属性.
我一直在考虑我的选择,但它们看起来很稀缺: …
我正在尝试使用Entity Framework 5.第一个问题是EF自动创建表.我尝试通过包括修复它
dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>().第二个问题是像这样的错误
自创建数据库以来,支持"CountryContext"上下文的模型已更改.考虑使用Code First Migrations来更新数据库.
我尝试修复它,dbModelBuilder.Conventions.Remove<IncludeMetadataConvention>();但没有意义.下一个数据访问层:
Table(Name = "tblCountries")]
public class Country
{
[Column(Name = "id", IsDbGenerated = true, IsPrimaryKey = true)]
public int Id {get;set;}
[Column(Name = "name")]
public string Name {get;set;}
}
public class CountryContext:DbContext
{
public CountryContext(string connStr):base(connStr)
{
}
public DbSet<Country> TblCountries { get; set; }
protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
{
dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
dbModelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
}
public class CountryDal:BaseDal
{
public int CheckIsExist(Country country)
{
int id = 0;
using (var …Run Code Online (Sandbox Code Playgroud) 好吧,这有点冗长/模糊,但我在特定情况下得到一个奇怪的错误,我使用Enum作为表键并尝试查询表,同时包含多个多对多相关实体.
以下示例代码中的错误是:
The type of the key field 'DietIs' is expected to be 'MvcApplication8.Models.DietIs', but the value provided is actually of type 'System.Int32'.
Run Code Online (Sandbox Code Playgroud)
在.net 4.5 Web项目中,我有以下实体配置:
public enum DietIs {
None,
Kosher,
Paleo,
Vegetarian
}
public class Diet {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public DietIs DietIs { get; set; }
public string Description { get; set; }
public virtual ICollection<Recipe> Recipes { get; set; }
public virtual ICollection<Menu> Menus { get; set; }
}
public class Recipe {
public int Id { …Run Code Online (Sandbox Code Playgroud) 长时间听众,第一次来电(最后在这里开了帐户!)......
我正在使用Visual Studio 2013与.NET 4.5.1和实体框架6(最终版本,而不是RC或beta).
尝试向我的实体添加DbGeography属性时,执行时出现此错误:
One or more validation errors were detected during model generation:
Geocoder.DbGeography: : EntityType 'DbGeography' has no key defined.
Define the key for this EntityType.
DbGeographies: EntityType: EntitySet 'DbGeographies' is based on type 'DbGeography' that has no keys defined.
Run Code Online (Sandbox Code Playgroud)
我已经确认我没有引用旧版本的Entity Framework(这里讨论).我一直在使用这篇文章和这篇MSDN文章中的示例/信息,因为这是我第一次涉及.NET中的空间类型(以及SQL Server,就此而言).
这是我的实体:
public class Location
{
public int Id { get; set; }
public string Name { get; set; }
public string …Run Code Online (Sandbox Code Playgroud) 使用Database first设计并使用tinyint(或smallint)列:
[MyEnumColumn] [tinyint] NOT NULL
Run Code Online (Sandbox Code Playgroud)
我在EDM中将此列映射到枚举类型
External Type: NSpace.MyEnumType
Name:MyEnumType
UnderlyingType:Byte
Run Code Online (Sandbox Code Playgroud)
NSpace.MyEnumType的定义如下:
public enum MyEnumType
{ One, Two, Three, All }
Run Code Online (Sandbox Code Playgroud)
仅在尝试从上下文加载实体时出现此错误:
指定的架构无效.错误:
对于概念类型"EntityDataModel.MyEnumType",找不到对应的对象层类型.
以下信息可能有助于解决以前的错误:
CLR枚举类型的基础类型与EDM枚举类型的基础类型不匹配.
如果我使用[Smallint]和[Int16]同样适用,但是一旦我将数据库更改为[Int]并将枚举类型更改为[Int32],错误就消失了.
当99.9%的时间内的枚举不超过256个项目或者我错过了其他内容时,为什么我需要将枚举值存储在4Byte(Int)数据字段而不是1Byte(Tinyint)中?
我正在使用EF迁移来跟踪对EF代码优先数据库模型的更改.现在我需要为每次迁移生成一个SQL脚本,以便我可以将这组脚本传递给DBA.
我能够生成SQL脚本 Update-Database -Script ...
但是,我想自动化这个.我希望-Script开关接受一个指定SQL编写位置的参数,但事实并非如此.此外,输出重定向不起作用,因为SQL脚本不会写入STDOUT,而是写入临时文件.我认为无法从脚本中获取该临时文件.
任何想法如何自动化迁移 - > SQL脚本生成?也许有一些我不知道的神奇的PowerShell技巧?
编辑:顺便说一句,使用migrate.exe或任何其他"迁移感知"方法不是一个选项,交付SQL脚本是必须的.
c# powershell entity-framework ef-migrations entity-framework-5
我有这样的数据模型

我想将对帐中的所有相关实体加载到Reconciliation对象中.
目前,我可以找到将所有相关的entites加载到单个Recon的唯一方法是多个列表.但我想加载一个Reconciliation对象中的每个相关实体.如果可能的话,优雅的方式.
Reconciliation recon = db.Reconciliations
.Where(r => r.ReconNum == 382485).First();
List<ReconciliationDetail> reconDetails = recon.ReconciliationDetails.ToList();
List<JrnlEntryDetail> jrnlDetails = reconDetails.Select(r => r.JrnlEntryDetail).ToList();
List<JrnlEntry> jrnl = jrnlDetails.Select(j => j.JrnlEntry).ToList();
List<ARInvoice> invoices = jrnl.SelectMany(j => j.ARInvoices).ToList();
List<ARInvoiceDetail> invoicesDetail = invoices
.SelectMany(i => i.ARInvoiceDetails).ToList();
List<ARCredMemo> credmemos = jrnl.SelectMany(j => j.ARCredMemoes).ToList();
List<ARCredMemoDetail> credmemosDetail = credmemos
.SelectMany(c => c.ARCredMemoDetails).ToList();
List<IncomingPay> incomingPays = jrnl.SelectMany(j => j.IncomingPays).ToList();
List<IncomingPayDetail> incomingPaysDetail = incomingPays
.SelectMany(i => i.IncomingPayDetails).ToList();
// ... and so on for outgoing pays, AP …Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×3
.net-4.5 ×1
enums ×1
linq ×1
nuget ×1
pluralize ×1
powershell ×1
soft-delete ×1
sqldatatypes ×1
sqlgeography ×1
transactions ×1