标签: entity-framework-5

将EF代理对象转换为原始POCO对象的最佳方法是什么?

我有一些POCO对象,我在EF Code First上下文中使用.所以,当我用数据填充它们时,我实际上是处理EF代理对象而不是POCO本身.

我有一个ASP.NET MVC4 ApiController,它返回我的POCO对象,我将在客户端应用程序中使用它.

我的"GET"方法看起来像这样:

    // GET api/Clients/5
    public Client GetClient(int id)
    {
        Client client = db.Clients.Find(id);
        if (client == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }

        return client;
    }
Run Code Online (Sandbox Code Playgroud)

这实际上不起作用,因为当序列化程序尝试序列化Client对象时,它实际上正在处理EF代理版本,这导致它打嗝.请参阅ApiController可以返回带有其他对象集合的对象吗?

所以,我可以通过这样做来关闭代理生成DbContext:

    db.Configuration.ProxyCreationEnabled = false;
Run Code Online (Sandbox Code Playgroud)

这确保我正在处理POCO而不是代理.但是,现在我的Client类的大多数成员都没有填充,因为它是EF代理,它懒得加载那些对我来说.

所以我真正想要的是使用EF代理类来获取数据,然后在最后一刻从我的方法返回原始POCO.

如果不在代码中手动创建整个对象(包括任何嵌套对象),我该怎么做?当然必须有一个简单的方法 - 或者至少是某种帮助类?

c# asp.net-mvc-4 asp.net-web-api entity-framework-5

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

实体框架5代码优先中的一对一和一对多关系

我试了整整一天才能搞定这个.我学到了很多关于EF的Fluent API的知识(例如,是一篇优秀的文章),但是我没有成功.

我有三个实体:

public class Address
{
   [Key]
   public virtual int AddressId { get; set; }
   public virtual string AddressString { get; set; }
}
public class User
{
   [Key]
   public virtual int UserId { get; set; }
   public virtual ICollection<Address> Addresses { get; set; }
}
public class House
{
   [Key]
   public virtual int HouseId { get; set; }
   public virtual Address Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并尝试的所有组合HasMany, HasOptional, WithOptional, WithOptionalDependentWithOptionalPrincipial我能为双方认为User …

c# one-to-one one-to-many ef-code-first entity-framework-5

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

我现在可以使用EF5并继续使用Visual Studio 2010吗?

我想使用最新的Entity Framework(EF5),但不喜欢购买新版本的Visual Studio.

是否可以在VS2010上使用EF5?有什么限制,如果有的话?

笔记:

  • 我在Brice的博客上看到EF5可以与.NET 4.0一起使用.这是我的方式吗?
  • 这个问题有点相关,但我不需要.NET版本,而是EF版本(但可能需要特定的.NET版本).
  • 这个问题非常相似,如果更多地关注.NET版本,而不是VS版本.

visual-studio-2010 entity-framework-5

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

EF5.x中对PadLeft缺乏支持的任何解决方法?

我正在研究MVC4和Entity Framework 5中的应用程序,最近在执行查询时遇到了这个异常.

{"LINQ to Entities无法识别方法'System.String PadLeft(Int32,Char)'方法,并且此方法无法转换为商店表达式."}

当我在过去遇到过类似的错误时,我只是在查询之外创建了一个变量,然后在LINQ语句中使用了该变量.不幸的是,在这种情况下,我正在操纵行结果,所以我不确定如何去做或如果这是最好的方法.任何帮助,将不胜感激.我的查询如下:

            IQueryable<System.String> LEAPrograms = db.Datamart_Draft
            .Where(where => where.snapshot_id == snapshot_id
                && !String.IsNullOrEmpty(where.entity_program))
            .Select(sel => (sel.entity_program.PadLeft(PROGRAMLENGTH, '0'))).Distinct();
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
2
解决办法
3181
查看次数

在MVC视图中显示存储过程的结果(EF 5/MVC 4)

目标

我想在我的视图中显示存储过程的结果.

问题

实体框架为我自动导入了一个执行程序的方法,但是我没有得到我期望在屏幕上显示的结果.

导入的功能是:

public virtual ObjectResult<getProductsListForHome_Result> getProductsListForHome(Nullable<int> inOffer, Nullable<int> categoryId)
{
    var inOfferParameter = inOffer.HasValue ?
        new ObjectParameter("inOffer", inOffer) :
        new ObjectParameter("inOffer", typeof(int));

    var categoryIdParameter = categoryId.HasValue ?
        new ObjectParameter("categoryId", categoryId) :
        new ObjectParameter("categoryId", typeof(int));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<getProductsListForHome_Result>("getProductsListForHome", inOfferParameter, categoryIdParameter);
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了什么

在ProductsController上:

//
// GET: /Products/
public ActionResult Index()
{
    ObjectResult<getProductsListForHome_Result> products = db.getProductsListForHome(1, 14);
    return View(products.ToList());
}
Run Code Online (Sandbox Code Playgroud)

使用前面的代码,当我访问时,http://myapp.com/Products/我收到以下消息:

传递到字典中的模型项的类型为'System.Collections.Generic.List 1[MyApp.Models.getProductsListForHome_Result]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1 [MyApp.Models.bm_products]'.

我该怎么做才能解决这个问题?

c# mysql stored-procedures entity-framework entity-framework-5

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

使用Entity Framework 5保存大图

我知道不建议使用Entity Framework进行批量插入,因为它会逐个添加它们.(例1,例2)

如何附加一个在其下面有一个大图形的对象,例如100K的对象? - 具体来说:

  • 使用EF5执行此操作的(时间/内存)性能考虑因素是什么?
  • 是否有存储大型图表的最佳实践?
  • 关系数据库甚至是存储大型图形的好主意吗?

一点背景:

  • 该图使用EF5 POCO创建,然后附加到根并保存.图表始终是新数据,永远不会更新.我们使用的数据库是SQL Server 2012.

  • 对于大型案例(100K对象),实际创建过程可能需要几十秒,因此如果附加/保存过程占用了10%的时间,则不会对整体时间性能产生显着影响.

entity-framework entity-framework-5

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

如何为我的Web应用程序编写测试?

问题(S)

  • 如何使用EntityFramework 5测试我的ASP.NET MVC4 Web应用程序?
  • 我应该使用像Moq这样的模拟框架吗?

介绍

几个星期以来,我一直在研究这个话题.我发现了很多材料,但我觉得完全无法回答这个问题.许多信息已有多年,可能不适用.

我的情况

我正在构建一个MVC4应用程序,它是对现有但过时的应用程序的重建.数据库已经存在(因此数据库优先方法)很大且很复杂.理想情况下我想要的是一个虚假的"实体"对象,它与我的主要实体对象相同,但使用了某种不同的"模拟"或内存数据库,这样我就可以生成一堆虚假数据,运行测试和收到反馈.例如:

FakeEntities _db = new FakeEntities();
// test a controller action
Run Code Online (Sandbox Code Playgroud)

至今...

据我所知,到目前为止我应该使用集成测试.根据Ladislav Mrnka的这篇文章,集成测试意味着测试控制器操作,意味着LINQ-to-entities和LINQ-to-objects的问题更少

如果您模拟存储库,您将使用Linq-To-Objects,您将进行绿色测试,但如果您使用Linq-To-Entities运行应用程序,您将获得一个例外

我知道他的意思,我可以同意 - 我想确保我总是使用Linq-To-Entities和一个真实的(或接近真实的)数据库.

我已经阅读了很多关于存储库模式的内容,而linush的这个博客看起来非常接近我的尝试.事实上,我已经创建了一个虚拟项目,我在其中测试了创建通用存储库并成功使用了Entity Framework和依赖于内存中ObjectSet的"模拟"DbContext.

我对这种方法的问题是

  1. 如上所述,这意味着我使用的是Linq-To-Objects而不是Linq-To-Entities
  2. 我的网络应用程序将依赖大量使用存储过程

回答之前的摘要

  • MVC4,EF5和SQL Server(虽然我想保持一些数据库不可知)
  • 能够测试使用SQL存储过程的逻辑
  • LINQ到实体
  • 数据库优先方法

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

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

以编程方式通过复选框将角色分配给MVC 4中的用户

我目前正在使用带有Razor Engine的MVC 4和C#作为逻辑背后的代码.已经构建了SimpleMembership数据库的定制版本以满足网站的要求.

该网站可以按预期创建和编辑角色和用户,但是我在向用户分配角色时遇到问题.某些搜索结果提供代码,以便在创建帐户时为用户分配特定角色.我们的要求不是这个,而是我们需要通过网站使用UI手动分配它们.

ASP.Net有很多教程(下面的例子),但是我发现很难找到MVC 4的相关教程.

http://www.asp.net/web-forms/tutorials/security/roles/assigning-roles-to-users-cs

阅读完上述内容后,我提出以下问题.

问题一:是否有通过UI分配用户角色的MVC教程?如果是这样,您是否可以提供教程的链接.

问题二:如果您没有指向教程的链接,是否可以就以下内容提供一些建议:

  • 当管理员加载用户管理UI时,表将加载用户列表,当他们单击特定用户的编辑按钮时,以下内容将生效并将数据传递回名为"Edit.cshtml"的视图.

    public ActionResult Edit(int id = 0)
    {
      var userProfile = _db.UserProfiles.Find(id);
      if (userProfile == null)
      {
        Response.Redirect("~/UserManagement/PageNotFound");
      }
    
      return View(userProfile);
    }
    
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(UserProfile userProfile)
    {
      if (ModelState.IsValid)
      {
        _db.Entry(userProfile).State = EntityState.Modified;
        _db.SaveChanges();
        return RedirectToAction("Index");
      }
    
      return View(userProfile);
    }
    
    Run Code Online (Sandbox Code Playgroud)

在"编辑"视图中,我正在考虑在页面上呈现部分视图,其中包含数据库中各种角色的复选框.类似于以下内容:

@model IEnumerable<PROJECTNAME.DAL.Models.Role>

@foreach (var item in Model)
{
    @Html.LabelFor(m => item.RoleName)

    <label class="bolder">
        Visible
        @Html.CheckBoxFor(m => item.Visible)
        <span class="lbl"></span>
    </label>
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken() …
Run Code Online (Sandbox Code Playgroud)

c# authentication razor asp.net-mvc-4 entity-framework-5

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

通用存储库和漏洞抽象

我正在实现一个存储库模式.我的主要原因是:

  • 从持久性细节中抽象客户端代码(实体框架)
  • 支持可测试性

通用存储库与否?

我遇到的问题是我是否应该有一个通用的存储库.一种IQueryable<T> Query()方法将为调用代码提供构造特定查询的手段.这里的问题是这是漏洞抽象 - 实体框架细节现在泄漏到我的客户端代码中.

在此输入图像描述

  • 这种影响单元测试怎么样? 我还能ICustomerRepository用这个实现模拟吗?

  • 这种效果如何影响我的持久层?像Azure存储表或NHibernate.

否则我将不得不实现非常具体的查询方法ICustomerRepository,例如GetIsActiveByFirstName()GetIsActiveByDistrict().我不喜欢这个,因为我的存储库类将变得拥挤不同的查询方法.该系统有数百种型号,因此可以有数百甚至数千种这样的方法来编写和维护.

entity-framework leaky-abstraction repository-pattern onion-architecture entity-framework-5

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

如何以N:N关系手动加载相关实体?

我正在使用EF5,当关系为1:N时,如果我想加载相关实体,我会执行以下操作:

此时,EF使用相关实体填充主要实体的属性导航.另外,在每个实体的类型的本地属性中,dbContext我拥有每种类型的所有实体.

但是,如果我使用N:N关系做同样的事情,我没有关系中间表的实体,当我执行查询时,我在dbContext每个类型的实体的本地执行,但是未填充属性导航.

我想知道为什么以及它是否存在替代方案.

我使用这种方式是因为我想使用T-SQL来创建动态查询.如果我使用预先加载,那么动态查询的灵活性与使用TSQL时不同,效率较低.如果我使用显式加载我做N个额外的查询,主要实体的结果中的每个记录之一用我的方式,我只有一个额外的查询,因为我一次得到所有相关的实体.如果我使用延迟加载我有同样的问题,N个额外的查询.

当关系为N:N时,为什么EF不会填充相关属性?

谢谢.

c# many-to-many entity-framework-5

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