我有一些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.
如果不在代码中手动创建整个对象(包括任何嵌套对象),我该怎么做?当然必须有一个简单的方法 - 或者至少是某种帮助类?
我试了整整一天才能搞定这个.我学到了很多关于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, WithOptionalDependent和WithOptionalPrincipial我能为双方认为User …
我想使用最新的Entity Framework(EF5),但不喜欢购买新版本的Visual Studio.
是否可以在VS2010上使用EF5?有什么限制,如果有的话?
笔记:
我正在研究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) 我想在我的视图中显示存储过程的结果.
实体框架为我自动导入了一个执行程序的方法,但是我没有得到我期望在屏幕上显示的结果.
导入的功能是:
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
几个星期以来,我一直在研究这个话题.我发现了很多材料,但我觉得完全无法回答这个问题.许多信息已有多年,可能不适用.
我正在构建一个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.
我对这种方法的问题是
我目前正在使用带有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) 我正在实现一个存储库模式.我的主要原因是:
通用存储库与否?
我遇到的问题是我是否应该有一个通用的存储库.一种IQueryable<T> Query()方法将为调用代码提供构造特定查询的手段.这里的问题是这是漏洞抽象 - 实体框架细节现在泄漏到我的客户端代码中.

这种影响单元测试怎么样? 我还能ICustomerRepository用这个实现模拟吗?
这种效果如何影响我的持久层?像Azure存储表或NHibernate.
否则我将不得不实现非常具体的查询方法ICustomerRepository,例如GetIsActiveByFirstName()和GetIsActiveByDistrict().我不喜欢这个,因为我的存储库类将变得拥挤不同的查询方法.该系统有数百种型号,因此可以有数百甚至数千种这样的方法来编写和维护.
entity-framework leaky-abstraction repository-pattern onion-architecture entity-framework-5
我正在使用EF5,当关系为1:N时,如果我想加载相关实体,我会执行以下操作:
使用T-SQL,我从数据库加载带有T-SQL的主要实体,如下所示:
select *
from MainEntities
where ...
Run Code Online (Sandbox Code Playgroud)使用T-SQL我加载相关的实体
select *
from RelatedEntities
where IDMainEntity IN (---)
Run Code Online (Sandbox Code Playgroud)此时,EF使用相关实体填充主要实体的属性导航.另外,在每个实体的类型的本地属性中,dbContext我拥有每种类型的所有实体.
但是,如果我使用N:N关系做同样的事情,我没有关系中间表的实体,当我执行查询时,我在dbContext每个类型的实体的本地执行,但是未填充属性导航.
我想知道为什么以及它是否存在替代方案.
我使用这种方式是因为我想使用T-SQL来创建动态查询.如果我使用预先加载,那么动态查询的灵活性与使用TSQL时不同,效率较低.如果我使用显式加载我做N个额外的查询,主要实体的结果中的每个记录之一用我的方式,我只有一个额外的查询,因为我一次得到所有相关的实体.如果我使用延迟加载我有同样的问题,N个额外的查询.
当关系为N:N时,为什么EF不会填充相关属性?
谢谢.