标签: entity-framework-5

EF是否可以自动删除孤立的数据,而不删除父数据?

对于使用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).

c# entity-framework entity-framework-5

14
推荐指数
1
解决办法
1万
查看次数

实体框架5与Telerik OpenAccess ORM(特定)

我正在开始一个新项目,并希望有关选择ORM的建议.我知道此主题之前已提出,但本主题特定于实体框架5(不是4)或Telerik OpenAccess ORM.

该项目将驻留在Windows Azure上并使用Windows Azure SQL数据库.一旦4.5在Azure上运行,我将它迁移到.NET 4.5.

我目前是Telerik Ultimate Collection用户.

有没有人知道这种情况有什么利弊?我现在略微倾向于Telerik OpenAccess.

谢谢

entity-framework telerik-open-access entity-framework-5

14
推荐指数
1
解决办法
7450
查看次数

升级到.NET 4.5和EF 5后,"启用 - 迁移"失败

我刚刚将我的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.

有谁知道我必须做什么才能为我的项目启用迁移?

asp.net-mvc-4 .net-4.5 entity-framework-5

14
推荐指数
1
解决办法
6097
查看次数

从EF 4升级到EF 5

我的应用程序基于.NET 4.0和EF 4.我现在正在考虑升级到最新版本.

  • 是否存在可能对我的申请产生不利影响的重大变化或行为差异?
  • 升级路径有多容易?升级到EF 5是否需要更改代码或其他工作?
  • 是否有任何与代码优先相关的新功能值得升级?

.net entity-framework .net-4.5 entity-framework-5

14
推荐指数
2
解决办法
3906
查看次数

带有实体框架5的MVC MiniProfiler模型第一个错误:无法确定提供程序名称

使用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

14
推荐指数
1
解决办法
2031
查看次数

实体框架HierarchyId变通方法

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,以便它识别父/子关系,这样我可以有效地拥有一个下属集合?例如 …

entity-framework entity-framework-5

14
推荐指数
2
解决办法
1万
查看次数

"还原自动迁移"是什么意思?

改变源控制分支,运行更新的数据库的回滚到先前的迁移之后,EF有时会显示文本"还原自动迁移",象下面这样:

Reverting automatic migration: 201305171619008_DescriptiveNameForMigration.
Reverting code-based migration: 201305162023299_Init.
Run Code Online (Sandbox Code Playgroud)

实体框架如何确定迁移应该是自动的,它的作用有何不同?

以下是如何重现它,假设您已经设置了一个已经设置了代码优先迁移的项目:

  1. 切换到源代码管理中的新分支
  2. 对模型,映射器进行更改并添加迁移
  3. 更新数据库
  4. 切换回默认分支
  5. Update-Database -TargetMigration:0 -Force
  6. 请参阅Update-Database命令的结果中的"还原自动迁移"

这就是我认为正在发生的事情,如果我错了,请纠正我.

  • Update-Database枚举__MigrationHistory中的迁移
  • 它在项目中找到相应的迁移文件并调用Down()方法
  • 如果相应的迁移文件不存在,那么它执行的最佳猜测如何基于在__MigrationHistory快照回滚迁移

database ef-migrations entity-framework-5

14
推荐指数
1
解决办法
799
查看次数

如何映射具有对实体的引用的值类型?

我在实体框架中遇到了映射问题.

我有以下课程(简化):

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

.net c# entity-framework entity-framework-5

14
推荐指数
1
解决办法
2289
查看次数

代码优先:将实体映射到现有数据库表

我使用实体框架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

14
推荐指数
2
解决办法
2万
查看次数

尝试使用EF更新实体并使用WCF发送它 - 属性在更新方案中导致异常

我正在尝试使用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)

c# wcf entity-framework-5

14
推荐指数
1
解决办法
395
查看次数