我正在寻找一种快速的方法来清理我的表数据与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) 我在使用同一个数据库进行合作的两个上下文时遇到了一些困难.这是场景:
在使用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记录.
我想要的是适用以下规则:
有没有人有任何关于如何让这些背景互相玩耍的提示?我真的不想破坏Identity对象和业务对象之间的引用完整性.
c# asp.net-mvc entity-framework entity-framework-6 entity-framework-6.1
我刚刚将数据库从数据库首先更改为代码!部署有多大改进!但现在我有以下问题.我从我的数据库生成了我的代码优先模型,但是在从生成的代码重新创建数据库后,我的数据库中的视图就像表一样生成了!
如何首先从代码生成我的视图?和/或如果我需要手动生成它们,将它们映射到我的实体?
编辑.
Luke McGregor的帖子肯定让我很亲近.是的,它现在生成视图.但迁移不起作用.
尝试执行Update-Database语句时,初始输出仍然是代码更改.
因此,我执行了Add-Migration xxx命令并再次触发了Update-Database命令.
编辑2:
解决我的代码优先代码和视图的SQL代码之间的一些差异解决了这个问题!
让我们举个例子来解释我的问题。
我的表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
我不确定我是接近错误的方式还是默认行为,但它没有像我期望的那样工作......
这是两个样本类......
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 为其创建的 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]
它确实变得复杂了。
使用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
我有一个ASP.NET MVC 5 Web应用程序,并使用EF 6.1访问我的数据库.
我有一些相当复杂的LINQ查询,最多需要10秒才能编译,但之后会在几毫秒内执行.EF确实缓存了这些查询,第二次执行查询时,它会在几毫秒内返回.
但是这个缓存不会持久存在,所以在每个应用程序重新启动时,需要重新编译查询,再次需要10秒.
有没有办法坚持这个查询缓存,以便它能够在应用程序重启后幸存下来?
c# asp.net-mvc caching entity-framework entity-framework-6.1
是否有任何内置方法在实体框架6.1中定义降序索引?IndexAttribute和DbMigration的CreateIndex方法仅允许创建升序索引。而且我不想为此使用原始sql。
我想以不同的方式防止这种情况发生,而不是将DateCreated的类型设置为可为空的DateTime.
完整的异常如下所示:
转换为值类型'System.DateTime'失败,因为具体化值为null.结果类型的泛型参数或查询必须使用可空类型.
当我在数据库上运行以下查询时,我可以看到那里没有空记录,所以我相信我应该避免将DateCreate属性设置为可以为空的DateTime,因为它对我没有多大意义(即使我知道它会解决问题).有什么我理解错了吗?
查询的以下行导致问题:
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)