标签: entity-framework-5

如何在Visual Studio 2012和Entity Framework 5中为单元测试设置LocalDb

我们有一个使用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

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

使用Moq模拟EF DbContext

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

我真正的上下文实现了这个接口IDbContextDbContext.

现在我正在尝试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: …

c# unit-testing moq dbcontext entity-framework-5

61
推荐指数
6
解决办法
6万
查看次数

创建复合密钥实体框架

不久,我想在我的表上创建复合键,保留主键,以提高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)

c# entity-framework composite-key entity-framework-5

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

逆向工程数据库时改进导航属性名称

我正在使用带有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

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

实体框架(EF)代码优先级联删除一对一或零关系

Julie LermanPluralsight"Entity Framework 5入门"课程的"Code First Modeling"部分之后,我创建了两个POCO类,其中包含一对一或零关系:父(User)和可选孩子(UserDetail).

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

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

更新实体框架模型后,Visual Studio不会看到更改

如果我对我的EF 5.0模型进行任何更改,VS似乎没有看到更改.我已经尝试添加一个新的表,它在模型中很好地显示,但是如果我尝试在某个地方使用它,表格不会出现在intellisense中,我也无法使用它.

我也尝试更改列的数据类型,如果我查看.edmx模型文件,它再次显示正常,但Visual Studio仍会在该字段上给出编译器错误,因为我试图分配不正确的数据类型.

如果我完全删除EDMX并重新创建它,那么更改工作正常.但每次我应该能够"从数据库更新模型"并重建时,从数据库重新生成是很烦人的.

我之前从未遇到过EF的这些问题.有谁知道这个问题的原因或解决方法?

谢谢.

c# entity-framework entity-framework-5

51
推荐指数
6
解决办法
10万
查看次数

用于更改列的数据类型的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

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

非静态方法需要目标.实体框架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)

ef-code-first .net-4.5 entity-framework-5

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

从存储过程中获取返回值

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

48
推荐指数
3
解决办法
8万
查看次数

将EF迁移整合到新的InitialCreate中

我一直在使用EF迁移一段时间,并且在我的项目中有超过100个迁移文件.我希望在继续之前将这些整合到一个迁移中 - 即我想用一个新版本替换现有的InitialCreate迁移,该版本将我的所有后续更改都考虑在内,这样我就可以删除所有其他迁移文件.

如果我不关心丢失数据库中的所有数据,我很容易这样做,但我是.

如何通过运行Update-Database(我认为使用Julie Lerman概述的方法无法实现)来保持所有数据的完整性并保留从头开始重新创建数据库(无数据)的能力?

entity-framework ef-migrations entity-framework-5

47
推荐指数
2
解决办法
8375
查看次数