标签: entity-framework-6.1

使用事务的缺点配置实体框架集成测试

我正在寻找一种快速的方法来清理我的表数据与EF进行集成测试.

每个人似乎围绕其测试方法包装事务并在测试后处理事务.

这样,数据永远不会写入表中.

像插入的新自动ID这样的东西仍在工作,但我问自己,与.commit()交易相比,这种方法真的可靠.

使用这种方法有什么缺点似乎不是真正的集成测试,因为数据库永远不会被触及......

或者换句话说是否存在错误的情况,如果没有commit()使用事务而不作为异常弹出?

UPDATE

public abstract class IntegrationTestsBase
    {
        protected TransactionScope TransactionScope;

        public abstract void TestSetup();
        protected void InitTestSetupOnTable(string tableName)
        {
            TransactionScope = new TransactionScope();

            using (var context = new TGBContext())
            {
                var cmdCommand = string.Format("DBCC CHECKIDENT ({0}, RESEED, 1)", tableName);
                context.Database.ExecuteSqlCommand(cmdCommand);
                context.SaveChanges();
            }
        }

        [TestCleanup]
        public void TestCleanup()
        {
            TransactionScope.Dispose();
        }
    }

[TestClass]
public class MyTests : IntegrationTestsBase
{
        [TestInitialize]
        public override void TestSetup()
        {
            base.InitTestSetupOnTable("MyTableName");          
        }
}
Run Code Online (Sandbox Code Playgroud)

entity-framework transactions entity-framework-6.1

6
推荐指数
1
解决办法
549
查看次数

MVC /实体代码 - 首先在它们之间具有引用完整性的多个上下文

我在使用同一个数据库进行合作的两个上下文时遇到了一些困难.这是场景:

在使用EF 6 Code-First的MVC应用程序中,有一个具有两个上下文的数据库. - 第一个上下文是具有自定义ApplicationUser对象的ApplicationIdentity上下文. - 第二个上下文是业务上下文,它包含一个Team模型:

 public class Team
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public ApplicationUser TeamLeader { get; set; }

    public string Name { get; set; }

    public virtual ICollection<ApplicationUser> TeamMembers { get; set; }

    public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

管理迁移一直很困难,尽管这个答案已经证明非常有用:同一个数据库中的多个DB上下文和EF 6中的应用程序以及代码优先迁移

问题是Identity上下文一直试图在其迁移中创建Team表,然后Business Context在创建,填充和保存新团队时不断尝试创建重复的ApplicationUser记录.

我想要的是适用以下规则:

  • IdentityContext仅负责创建和更改Identity表的模式.它不知道对象(即团队)在其责任范围之外.
  • 业务上下文负责其对象与IdentityObject之间的引用完整性,但它可能无法编辑Identity表中的记录.如果用户不存在,请输入错误,不要创建.

有没有人有任何关于如何让这些背景互相玩耍的提示?我真的不想破坏Identity对象和业务对象之间的引用完整性.

c# asp.net-mvc entity-framework entity-framework-6 entity-framework-6.1

6
推荐指数
1
解决办法
366
查看次数

首先从EF 6.1代码生成SQL视图

我刚刚将数据库从数据库首先更改为代码!部署有多大改进!但现在我有以下问题.我从我的数据库生成了我的代码优先模型,但是在从生成的代码重新创建数据库后,我的数据库中的视图就像表一样生成了!

如何首先从代码生成我的视图?和/或如果我需要手动生成它们,将它们映射到我的实体?

编辑.

Luke McGregor的帖子肯定让我很亲近.是的,它现在生成视图.但迁移不起作用.

尝试执行Update-Database语句时,初始输出仍然是代码更改.

因此,我执行了Add-Migration xxx命令并再次触发了Update-Database命令.

编辑2:

解决我的代码优先代码和视图的SQL代码之间的一些差异解决了这个问题!

c# entity-framework entity-framework-6.1

5
推荐指数
1
解决办法
6608
查看次数

如何在 EF 6.1 CodeFirst 中的视图上添加导航属性

让我们举个例子来解释我的问题。


我的表1

+id

+myTable2Id


我的表2

+id


我的视图1

+id

+myTable2Id


MyView1 存在的情况下,来自 MyTable1 的数据。现在我想从我的 EF6.1 代码优先方法在我的视图中创建一个导航属性到 MyTable2。

我知道从数据库优先的方法中可以实现,但是从代码优先的方法中也可以实现吗?

编辑:

我在互联网上搜索了一些,但由于“视图”一词的含义很多,因此很难找到有关它的信息。

同样使用我尝试过的代码中的方法,我总是收到无法完成迁移的错误。因为迁移尝试向视图添加外键,这是不可能的。

编辑2:

详细说明我的解释。我希望能够通过以下方式在代码中处理它:

Guid table2Id = context.MyView1.FirstOrDefault().MyTable2.id;
Run Code Online (Sandbox Code Playgroud)

编辑3:

我会再详细说明一下,看看我是否能更好地解释我的问题。

当我将以下内容添加到我的视图实体时:

public virtual MyTable2 Table2 { get; set;}
Run Code Online (Sandbox Code Playgroud)

EF 会自动生成以下迁移:

public override void Up() {
    CreateIndex("MyView1", "MyTable2Id");
    AddForeignKey("MyView1", "MyTable2Id", "MyTable2", "id")
}
Run Code Online (Sandbox Code Playgroud)

在运行 update-database 时出现以下错误:

“无法在视图 'MyView1' 上创建索引,因为该视图未绑定架构”

编辑4:

在评论的帮助下,迁移不是石头......而且是可变的,我做到了。

我使用了以下流畅的API:

    // Map one-to-zero or one relationship 
    modelBuilder.Entity<MyTable2>()
        .HasRequired(t => t.MyTable1)
        .WithOptional(t => t.MyTable2);

    modelBuilder.Entity<MyTable1>()
        .HasOptional(t => t.MyTable2);
Run Code Online (Sandbox Code Playgroud)

并将我的表更改为:(FK 到 MyTable2 并从视图中删除) …

c# entity-framework navigation-properties entity-framework-6 entity-framework-6.1

5
推荐指数
1
解决办法
5088
查看次数

想要实体框架6.1急切加载只加载第一级

我不确定我是接近错误的方式还是默认行为,但它没有像我期望的那样工作......

这是两个样本类......

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Department Department { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

第二个是部门

public class Department
{
    public string Name { get; set; }

    public List<Person> People { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

上下文配置

public MyDbContext() : base("DefaultConnection") 
{
    this.Configuration.ProxyCreationEnabled = false;
    this.Configuration.LazyLoadingEnabled = false; 
}

public DbSet<Person> People { get; set; }
public DbSet<Department> Departments { get; set; }
Run Code Online (Sandbox Code Playgroud)

我试着加载名字来自'Smith'的人

var foundPeople 
        = context …
Run Code Online (Sandbox Code Playgroud)

entity-framework entity-framework-6.1

5
推荐指数
1
解决办法
2742
查看次数

如何为实体框架创建的 SQL 语句获得更好的表别名?

是否可以控制 Entity Framework 为其创建的 SQL 语句使用哪些表别名?例如,代替

SELECT [Extent1].[Id] AS [Id]
FROM [dbo].[Orders] AS [Extend1]
INNER JOIN [dbo].[Customers] AS [Extend2] ON [Extend1].[CustomerId] = [Extend2].[Id]
WHERE [Extent2].[Name] = 'xyz'
Run Code Online (Sandbox Code Playgroud)

我想得到

SELECT [order].[Id] AS [Id]
FROM [dbo].[Orders] AS [order]
INNER JOIN [dbo].[Customers] AS [customer] ON [order].[CustomerId] = [customer].[Id]
WHERE [customer].[Name] = 'xyz'
Run Code Online (Sandbox Code Playgroud)

或类似的东西,只要我不必记住哪个扩展数是哪个表。当然,在这个简单的示例中它没有问题,但是在您必须[Extend1]进行的查询中,[Extend7]它确实变得复杂了。

.net entity-framework entity-framework-6.1

5
推荐指数
1
解决办法
1691
查看次数

MVC 5带继承的脚手架使用错误的实体集

使用MVC 5和EF 6.1,我使用的是简单的继承层次结构,其中类继承自Person类.对于这两个类,我在我的数据库上下文中有一个实体集(DbSet属性):

public class DatabaseContext : DbContext
{
    public DbSet<Person> Persons { get; set; }
    public DbSet<Student> Students { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我要求脚手架为Student,子类生成一个控制器时,它使用Persons实体集,导致如下的语句

    Student student = db.Persons.Find(id);
Run Code Online (Sandbox Code Playgroud)

编译器显然抱怨它不能只将任何人转换为学生.

有没有办法确保脚手架使用正确的实体集(在这种情况下是学生)?

请注意,删除Persons实体集不是一个好的解决方案,因为还有其他控制器需要它.

asp.net-mvc entity-framework dbcontext asp.net-mvc-5 entity-framework-6.1

5
推荐指数
1
解决办法
532
查看次数

持久化实体框架查询缓存

我有一个ASP.NET MVC 5 Web应用程序,并使用EF 6.1访问我的数据库.
我有一些相当复杂的LINQ查询,最多需要10秒才能编译,但之后会在几毫秒内执行.EF确实缓存了这些查询,第二次执行查询时,它会在几毫秒内返回.
但是这个缓存不会持久存在,所以在每个应用程序重新启动时,需要重新编译查询,再次需要10秒.

有没有办法坚持这个查询缓存,以便它能够在应用程序重启后幸存下来?

c# asp.net-mvc caching entity-framework entity-framework-6.1

5
推荐指数
1
解决办法
1477
查看次数

首先在实体框架代码中定义降序索引

是否有任何内置方法在实体框架6.1中定义降序索引?IndexAttribute和DbMigration的CreateIndex方法仅允许创建升序索引。而且我不想为此使用原始sql。

entity-framework ef-code-first entity-framework-6.1

5
推荐指数
0
解决办法
476
查看次数

防止"'System.DateTime'失败,因为具体化值为null"

我想以不同的方式防止这种情况发生,而不是将DateCreated的类型设置为可为空的DateTime.

完整的异常如下所示:

转换为值类型'System.DateTime'失败,因为具体化值为null.结果类型的泛型参数或查询必须使用可空类型.

当我在数据库上运行以下查询时,我可以看到那里没有空记录,所以我相信我应该避免将DateCreate属性设置为可以为空的DateTime,因为它对我没有多大意义(即使我知道它会解决问题).有什么我理解错了吗?

SQL查询结果

查询的以下行导致问题:

DateCreated = subJoined.dateUploaded
Run Code Online (Sandbox Code Playgroud)

这是完整的LINQ查询:

using (var db = new ABEntities())
            {
                var features = (from textObject in db.textObjects
                                join container in db.containers.DefaultIfEmpty() on textObject.textObjectPK equals
                                    container.textObjectPK into tObjsContainerJoined
                                from subContainerJoin in tObjsContainerJoined.DefaultIfEmpty()
                                join tObjsMedia in db.media on subContainerJoin.mediaID equals
                                    tObjsMedia.mediaID into tObjsMediaJoined
                                from subJoined in tObjsMediaJoined.DefaultIfEmpty()
                                from textContainer in tObjsContainerJoined
                                where
                                    textObject.version == Constants.Versions.LATEST &&
                                    textObject.textObjectTypeID == Constants.News.FEATURES &&
                                    textObject.deployDate <= DateTime.Now
                                select new TextObject
                                {
                                    Id = textObject.textObjectID,
                                    Title = textObject.title,
                                    ContainerId = textContainer.containerID, …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework entity-framework-6 entity-framework-6.1

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