我们有一个使用Entity Framework 5的Visual Studio 2012 ASP.NET MVC项目.
有些单元测试依赖于数据库.在测试项目中设置app.config文件以使用中央SQL Server数据库可以正常工作.
但是,使用LocalDb会更好,因此每个开发人员在运行测试时都有自己的数据库.特别是因为我们希望DropCreateDatabaseAlways在运行时设置测试.
但是,我无法让设置工作.如果我在app.config中尝试这个:
<add name="TestDb"
connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=unittestdb;
Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\unittestdb.mdf"
providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
我明白了:
System.Data.SqlClient.SqlException:发生文件激活错误.物理文件名'\ unittestdb.mdf'可能不正确.诊断并更正其他错误,然后重试该操作.CREATE DATABASE失败.无法创建列出的某些文件名.检查相关错误.
听起来它想要mdf文件已经存在,这似乎很奇怪,因为它试图创建数据库.手动创建mdf文件不会更改错误消息.
unit-testing mstest entity-framework-5 localdb visual-studio-2012
我正在尝试使用模拟的DbContext为我的服务创建单元测试.我创建了一个IDbContext具有以下功能的界面:
public interface IDbContext : IDisposable
{
IDbSet<T> Set<T>() where T : class;
DbEntityEntry<T> Entry<T>(T entity) where T : class;
int SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我真正的上下文实现了这个接口IDbContext和DbContext.
现在我正在尝试IDbSet<T>在上下文中模拟它,所以它返回一个List<User>代替.
[TestMethod]
public void TestGetAllUsers()
{
// Arrange
var mock = new Mock<IDbContext>();
mock.Setup(x => x.Set<User>())
.Returns(new List<User>
{
new User { ID = 1 }
});
UserService userService = new UserService(mock.Object);
// Act
var allUsers = userService.GetAllUsers();
// Assert
Assert.AreEqual(1, allUsers.Count());
}
Run Code Online (Sandbox Code Playgroud)
我总是得到这个错误.Returns: …
不久,我想在我的表上创建复合键,保留主键,以提高sql server搜索性能.每当我搜索没有主键的实体(即一串GUID)时,性能问题就会发生在200k数据表上.假设我有3个班级
public class Device{
public int ID { get; set; }
public string UDID { get; set; }
public string ApplicationKey { get; set; }
public string PlatformKey { get; set; }
public ICollection<NotificationMessageDevice> DeviceMessages { get; set; }
}
public class NotificationMessageDevice {
[Column(Order = 0), Key, ForeignKey("NotificationMessage")]
public int NotificationMessage_ID { get; set; }
[Column(Order = 1), Key, ForeignKey("Device")]
public int Device_ID { get; set; }
public virtual Device Device { get; set; }
public virtual NotificationMessage …Run Code Online (Sandbox Code Playgroud) 我正在使用带有Entity Framework Power Tools Beta 2的Visual Studio的Entity Framework 5来反向设计中等大小的数据库(~100个表).
不幸的是,导航属性没有有意义的名称.例如,如果有两个表:
CREATE TABLE Contacts (
ContactID INT IDENTITY (1, 1) NOT NULL,
...
CONSTRAINT PK_Contacts PRIMARY KEY CLUSTERED (ContactID ASC)
}
CREATE TABLE Projects (
ProjectID INT IDENTITY (1, 1) NOT NULL,
TechnicalContactID INT NOT NULL,
SalesContactID INT NOT NULL,
...
CONSTRAINT PK_Projects PRIMARY KEY CLUSTERED (ProjectID ASC),
CONSTRAINT FK_Projects_TechnicalContact FOREIGN KEY (TechnicalContactID)
REFERENCES Contacts (ContactID),
CONSTRAINT FK_Projects_SalesContact FOREIGN KEY (SalesContactID)
REFERENCES Contacts (ContactID),
...
}
Run Code Online (Sandbox Code Playgroud)
这将生成如下类:
public class …Run Code Online (Sandbox Code Playgroud) t4 entity-framework ef-code-first entity-framework-5 ef-power-tools
在Julie Lerman的Pluralsight"Entity Framework 5入门"课程的"Code First Modeling"部分之后,我创建了两个POCO类,其中包含一对一或零关系:父(User)和可选孩子(UserDetail).
请注意,图中UserId属性是UserDetail的主键和外键.
相关代码:
public class User
{
//...
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
/* Has a 1:0..1 relationship with UserDetail */
public virtual UserDetail UserDetail { get; set; }
//...
}
public class UserDetail
{
//...
/* Has a 0..1:1 relationship with User */
public virtual User User { get; set; }
[Key, ForeignKey("User")]
public int UserId { get; set; …Run Code Online (Sandbox Code Playgroud) c# entity-framework cascading-deletes ef-code-first entity-framework-5
如果我对我的EF 5.0模型进行任何更改,VS似乎没有看到更改.我已经尝试添加一个新的表,它在模型中很好地显示,但是如果我尝试在某个地方使用它,表格不会出现在intellisense中,我也无法使用它.
我也尝试更改列的数据类型,如果我查看.edmx模型文件,它再次显示正常,但Visual Studio仍会在该字段上给出编译器错误,因为我试图分配不正确的数据类型.
如果我完全删除EDMX并重新创建它,那么更改工作正常.但每次我应该能够"从数据库更新模型"并重建时,从数据库重新生成是很烦人的.
我之前从未遇到过EF的这些问题.有谁知道这个问题的原因或解决方法?
谢谢.
我的项目中有一个模型如下:
public class Model
{
public int Id { get; set; }
public long FromNo { get; set; }
public long ToNo { get; set; }
public string Content { get; set; }
public long TicketNo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
迁移如下
public override void Down()
{
AlterColumn("dbo.Received", "FromNo", c => c.Long(nullable: false));
AlterColumn("dbo.Received", "ToNo", c => c.Long(nullable: false));
AlterColumn("dbo.Received", "TicketNo", c => c.Long(nullable: false));
}
public override void Up()
{
AlterColumn("dbo.Received", "FromNo", c => c.String());
AlterColumn("dbo.Received", "ToNo", c => …Run Code Online (Sandbox Code Playgroud) c# entity-framework visual-studio ef-migrations entity-framework-5
我收到错误"非静态方法需要一个目标." 当我运行以下查询时:
var allPartners = DbContext.User
.Include(u => u.Businesses)
.Where(u => u.Businesses.Any(x => x.Id == currentBusinessId))
.ToList();
Run Code Online (Sandbox Code Playgroud)
我的entites定义如下:
public class User : Entity
{
public virtual List<Business> Businesses { get; set; }
}
public class Business : Entity
{
public virtual List<User> Users { get; set; }
}
public class Entity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的上下文配置如下;
public class Context : DbContext, IDatabaseSession
{
public DbSet<Business> Business { get; set; }
public DbSet<User> User …Run Code Online (Sandbox Code Playgroud) 我正在使用Entity Framework 5和Code First方法.我需要从存储过程中读取返回值; 我已经在读取输出参数和发送输入参数,但我不知道如何读取返回值.
可能吗?
这是我用来调用存储过程的代码:
var outParam = new SqlParameter();
outParam.ParameterName = "@StatusLog";
outParam.SqlDbType = SqlDbType.NVarChar;
outParam.Size = 4000;
outParam.Direction = ParameterDirection.Output;
var code = new SqlParameter();
code.ParameterName = "@Code";
code.Direction = ParameterDirection.Input;
code.SqlDbType = SqlDbType.VarChar;
code.Size = 20;
code.Value = "123";
var data = _context.Database.SqlQuery<Item>("exec spItemData @Code, @StatusLog OUT", code, outParam);
var result = data.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud) c# stored-procedures return-value ef-code-first entity-framework-5
我一直在使用EF迁移一段时间,并且在我的项目中有超过100个迁移文件.我希望在继续之前将这些整合到一个迁移中 - 即我想用一个新版本替换现有的InitialCreate迁移,该版本将我的所有后续更改都考虑在内,这样我就可以删除所有其他迁移文件.
如果我不关心丢失数据库中的所有数据,我很容易这样做,但我是.
如何通过运行Update-Database(我认为使用Julie Lerman概述的方法无法实现)来保持所有数据的完整性并保留从头开始重新创建数据库(无数据)的能力?
c# ×6
unit-testing ×2
.net-4.5 ×1
dbcontext ×1
localdb ×1
moq ×1
mstest ×1
return-value ×1
t4 ×1