对于使用Code First EF 5 beta的应用程序,我有:
public class ParentObject
{
public int Id {get; set;}
public virtual List<ChildObject> ChildObjects {get; set;}
//Other members
}
Run Code Online (Sandbox Code Playgroud)
和
public class ChildObject
{
public int Id {get; set;}
public int ParentObjectId {get; set;}
//Other members
}
Run Code Online (Sandbox Code Playgroud)
必要时,相关的CRUD操作由存储库执行.
在
OnModelCreating(DbModelBuilder modelBuilder)
Run Code Online (Sandbox Code Playgroud)
我已经设置了它们:
modelBuilder.Entity<ParentObject>().HasMany(p => p.ChildObjects)
.WithOptional()
.HasForeignKey(c => c.ParentObjectId)
.WillCascadeOnDelete();
Run Code Online (Sandbox Code Playgroud)
因此,如果a ParentObject被删除,它的ChildObjects也是如此.
但是,如果我跑:
parentObject.ChildObjects.Clear();
_parentObjectRepository.SaveChanges(); //this repository uses the context
Run Code Online (Sandbox Code Playgroud)
我得到了例外:
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
这是有道理的,因为实体的定义包括正在被破坏的外键约束.
我可以将实体配置为在孤立时"清除自己",或者我必须手动ChildObject从上下文中删除这些(在这种情况下使用ChildObjectRepository).
我正在开始一个新项目,并希望有关选择ORM的建议.我知道此主题之前已提出,但本主题特定于实体框架5(不是4)或Telerik OpenAccess ORM.
该项目将驻留在Windows Azure上并使用Windows Azure SQL数据库.一旦4.5在Azure上运行,我将它迁移到.NET 4.5.
我目前是Telerik Ultimate Collection用户.
有没有人知道这种情况有什么利弊?我现在略微倾向于Telerik OpenAccess.
谢谢
我刚刚将我的MVC4项目升级到.NET 4.5和EF5并开始使用VS2012.在意识到我需要再次在程序包管理器中设置自动迁移后,我运行Enable-Migrations - EnableAutomaticMigrations并收到错误
No context type was found in the assembly 'MySolutionName'.
一些研究表示,它与EF5有关,不支持预发布.我跑了,Install-Package EntityFramework -IncludePrerelease但它说已经安装了EF5(当我之前通过NuGetmanager安装它时没有指定-IncludePrerelease.
有谁知道我必须做什么才能为我的项目启用迁移?
我的应用程序基于.NET 4.0和EF 4.我现在正在考虑升级到最新版本.
使用Entity Framework 5,MiniProfiler 2.为MiniProfiler.EF安装Nuget.
按如下方式创建连接
var conn = new EFProfiledDbConnection(DbConnections.GetSqlConnection(), MiniProfiler.Current);
return new MyDbContext(conn, true);
Run Code Online (Sandbox Code Playgroud)
尝试使用DbContext检索数据时,将返回以下错误:
Unable to determine the provider name for connection of type
'StackExchange.Profiling.Data.EFProfiledDbConnection'.`
Run Code Online (Sandbox Code Playgroud)
我尝试将以下内容添加到web.config:
<system.data>
<DbProviderFactories>
<remove invariant="StackExchange.Profiling.Data.ProfiledDbProviderFactory" />
<add name="StackExchange.Profiling.Data.ProfiledDbProviderFactory"
invariant="StackExchange.Profiling.Data.ProfiledDbProviderFactory"
description="StackExchange.Profiling.Data.ProfiledDbProviderFactory"
type="StackExchange.Profiling.Data.ProfiledDbProviderFactory, MiniProfiler, Version=2.0.2.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
</DbProviderFactories>
</system.data>
Run Code Online (Sandbox Code Playgroud)
这没有用.我也尝试过使用MiniProfiler.EntityFramework中不同的EFProviderFactories,但是无法使用它们.
如果我尝试运行MiniProfilerEF.Initialize();的App_Start,然后我在尝试访问数据库时,出现以下错误:
如果在Code First模式下使用,使用T4模板为Database First和Model First开发生成的代码可能无法正常工作.要继续使用Database First或Model First,请确保在执行应用程序的配置文件中指定了Entity Framework连接字符串.要使用从Database First或Model First生成的这些类,使用Code First添加任何其他配置,使用属性或DbModelBuilder API,然后删除引发此异常的代码.
卸下DbProviderFactories从web.config部分,并运行MiniProfilerEF.Initialize_EF42();在App_Start在原来的错误.
正如MiniProfiler页面所说的那样,MiniProfilerEF.Initialize()首先只是代码,这似乎不是一种可行的方式.
其他搜索没有给我任何其他的尝试,除了在Web.Config中添加部分.有关如何进行的任何建议?目标是能够使用由Mvc MiniProfiler分析的Model First DbContext.
entity-framework mvc-mini-profiler asp.net-mvc-4 entity-framework-5
EF 5.0
我正在研究一个原型来一起测试hierarchyid和实体框架.我有以下架构:
Create Table dbo.Employee
(
EmployeeId int identity not null,
Name nvarchar(100) not null,
Node hierarchyid not null,
NodePath as Node.ToString() persisted,
Level AS Node.GetLevel() persisted,
ManagerNode as Node.GetAncestor(1) persisted,
ManagerNodePath as Node.GetAncestor(1).ToString() persisted
);
Alter Table dbo.Employee
Add Constraint EmployeePK Primary Key NonClustered (EmployeeId);
Go
--Enforce Hierarchy
Alter Table dbo.Employee
Add Constraint EmployeeManagerNodeNodeFK Foreign Key (ManagerNode) References Employee(Node);
Go
Create Unique Clustered Index EmployeeDepthFirstIndex on dbo.Employee(Node);
Go
Create NonClustered Index EmployeeBreathFirstIndex on dbo.Employee(Level, Node);
Go
Run Code Online (Sandbox Code Playgroud)
从我的阅读中,EF目前不支持hierarchyid数据类型,但是有些人提出了一些变通方法,例如创建我上面已经完成的计算列(Node.ToString()).
有没有办法设置EF,以便它识别父/子关系,这样我可以有效地拥有一个下属集合?例如 …
改变源控制分支,运行更新的数据库的回滚到先前的迁移之后,EF有时会显示文本"还原自动迁移",象下面这样:
Reverting automatic migration: 201305171619008_DescriptiveNameForMigration.
Reverting code-based migration: 201305162023299_Init.
Run Code Online (Sandbox Code Playgroud)
实体框架如何确定迁移应该是自动的,它的作用有何不同?
以下是如何重现它,假设您已经设置了一个已经设置了代码优先迁移的项目:
这就是我认为正在发生的事情,如果我错了,请纠正我.
我在实体框架中遇到了映射问题.
我有以下课程(简化):
public class Building
{
public int ID { get; set; }
// *.. snip..* other properties
public Location Location { get; private set; }
}
public class Location
{
public string Street {get; set;}
public Country country {get; set}
}
public class Country
{
public int ID { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Building和Country是实体,它们保存在数据库中.位置是值类型,应映射到与Building相同的表.
但是,当我以这种方式映射它时,实体框架也希望将Location映射到一个表,并抱怨它没有Key.我不想给它一把钥匙,因为它属于建筑物,根本不应该是一个实体.
我已经看到了一些解决方法,说你需要将Country放在Building-class上,但这感觉不好(并且在语义上是完全错误的).
我正在使用Entity Framework 5
我使用实体框架6代码优先与现有数据库,但在将我的实体映射到数据库表时遇到问题.
通常,我会使用数据库优先方法并生成我的实体和上下文代码,但使用设计器已经成为一个巨大的痛苦.
我已经设置了Database.SetInitializer(null),因为我不希望EF更改我的架构.
数据库架构:

守则一:
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class ReleaseControlContext : DbContext
{
public ReleaseControlContext()
: base(ConfigurationManager.ConnectionStrings["ReleaseControl"].ConnectionString)
{
Database.SetInitializer<ReleaseControlContext>(null);
}
public DbSet<Project> Projects { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
来电代码:
using(var context = new ReleaseControlContext())
{
var projects = context.Projects.ToList();
}
Run Code Online (Sandbox Code Playgroud)
抛出以下异常:
SqlException:无效的对象名称'dbo.Projects'.
这是因为我的数据库表是Project而不是Projects.我不想将我的上下文重命名DbSet<Project>为"Project",因为这在语义上是不正确的.
题:
我是否必须使用流畅的API /数据注释来在Project数据库表和DbSet<Project> Projects …
.net c# entity-framework entity-framework-5 entity-framework-6
我正在尝试使用WCF发送对象.使用EF从DB检索对象.
这是我得到的例外:
这仅在更新方案中发生.插入效果很好.
跟踪错误,我发现问题出在Travelers我最近添加的一个集合(称为).
以下是在WCF发送更新后的实体之前,在更新之后尝试在运行时观察其值时发生的情况:
这是违规类的属性声明(我尝试取消注释DataMember属性,但它不起作用):
[DataContract]
public class Travel : InsuredObject, ISaleEntity, ICloneable
{
//[DataMember]
public virtual ICollection<Traveler> Travelers { get; set; }
...
Run Code Online (Sandbox Code Playgroud)
我已经读过这个this.Configuration.ProxyCreationEnabled = false;和/或this.Configuration.LazyLoadingEnabled = false;可能会修复它,但我不能因为我以外的原因而改变它们,即使我尝试使用它们 - 我还有其他一些例外......
附加代码:
更新方法:
public virtual TEntity CreateAndUpdate(int saleId, TEntity entity) {
var context = ((IObjectContextAdapter)this.Context).ObjectContext;
var objBaseSet = context.CreateObjectSet<TBase>();
var entityBaseKey = context.CreateEntityKey(objBaseSet.EntitySet.Name, entity);
Object foundBaseEntity;
var baseExists = context.TryGetObjectByKey(entityBaseKey, out foundBaseEntity);
entity.Id = saleId;
if (!baseExists) {
this.GetDbSet<TEntity>().Add(entity);
}
this.objectContext.SaveChanges(); …Run Code Online (Sandbox Code Playgroud)