我正在运行EF 4.2 CF并想在我的POCO对象的某些列上创建索引.
举个例子,假设我们有这个员工类:
public class Employee
{
public int EmployeeID { get; set; }
public string EmployeeCode { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime HireDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我们经常通过EmployeeCode对员工进行搜索,因为有很多员工,因为性能原因而将索引编入索引会很不错.
我们能用流利的api以某种方式做到这一点吗?或者数据注释?
我知道可以执行这样的sql命令:
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
Run Code Online (Sandbox Code Playgroud)
我非常想避免那样的原始SQL.
我知道这不存在,但寻找沿着这些方向的东西:
class EmployeeConfiguration : EntityTypeConfiguration<Employee>
{
internal EmployeeConfiguration()
{
this.HasIndex(e => e.EmployeeCode)
.HasIndex(e => e.FirstName)
.HasIndex(e => e.LastName);
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用System.ComponentModel.DataAnnotationsPOCO可能看起来像这样(我知道这不存在):
public class Employee
{ …Run Code Online (Sandbox Code Playgroud) c# fluent-interface entity-framework-4 data-annotations ef-code-first
似乎在EF4中默认启用了延迟加载.至少,在我的项目中,我可以看到它的价值
dataContext.ContextOptions.LazyLoadingEnabled
Run Code Online (Sandbox Code Playgroud)
默认情况下为true.我不想延迟加载,我不想写:
dataContext.ContextOptions.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)
每次我得到一个新的背景.那么有没有办法在整个项目中默认关闭它?
我在一个存储过程中查询,该存储过程使用一些动态SQL调用某些链接服务器.我知道EF不喜欢这样,所以我特意列出了所有要返回的列.然而,它仍然不喜欢这样.我在这做错了什么?我只是希望EF能够检测从存储过程返回的列,以便我可以创建我需要的类.
请参阅以下代码,它构成了我的存储过程的最后几行:
SELECT
#TempMain.ID,
#TempMain.Class_Data,
#TempMain.Web_Store_Class1,
#TempMain.Web_Store_Class2,
#TempMain.Web_Store_Status,
#TempMain.Cur_1pc_Cat51_Price,
#TempMain.Cur_1pc_Cat52_Price,
#TempMain.Cur_1pc_Cat61_Price,
#TempMain.Cur_1pc_Cat62_Price,
#TempMain.Cur_1pc_Cat63_Price,
#TempMain.Flat_Length,
#TempMain.Flat_Width,
#TempMain.Item_Height,
#TempMain.Item_Weight,
#TempMain.Um,
#TempMain.Lead_Time_Code,
#TempMain.Wp_Image_Nme,
#TempMain.Wp_Mod_Dte,
#TempMain.Catalog_Price_Chg_Dt,
#TempMain.Description,
#TempMain.Supersede_Ctl,
#TempMain.Supersede_Pn,
TempDesc.Cust_Desc,
TempMfgr.Mfgr_Item_Nbr,
TempMfgr.Mfgr_Name,
TempMfgr.Vendor_ID
FROM
#TempMain
LEFT JOIN TempDesc ON #TempMain.ID = TempDesc.ID
LEFT JOIN TempMfgr ON #TempMain.ID = TempMfgr.ID
Run Code Online (Sandbox Code Playgroud) 我正在寻找为DbContext设置CommandTimeout的方法.搜索之后,我通过将DbContext转换为ObjectContext并为objectContext的CommandTimeout属性设置值来找到方法.
var objectContext = (this.DbContext as IObjectContextAdapter).ObjectContext;
Run Code Online (Sandbox Code Playgroud)
但我必须使用DbContext.
我正在按照Scott Gu的一个教程来引用一个名为DbContext的类.我无法在框架4上的任何命名空间中找到它,在我看来,它已从CT4 DbContext重命名为.net4 System.Data.Linq.DataContext.我的假设是否正确?
我即将开始实现一个项目的数据访问基础设施,该项目采用DDD方法构建(这是我第一次尝试DDD,所以要温和;-)).
我将使用Entity Framework.到目前为止,我正在研究朱莉·勒曼(Julie Lerman)在她的伟大着作" 编程实体框架 "(Programming Entity Framework)中使用的方法,其中使用了ADO.NET POCO实体生成器,对T4模板和一些更多自定义代码进行了一些更改.
今天我开始使用Database First方法阅读有关EF4.1和ADO.NET DbContext Generator的文章,我正在尝试决定应该选择哪一个.
DbContext和EF4.1的DDD方法似乎比POCO实体更好,更清晰,但我担心它会在不久的将来导致一些问题,因为EF4.1仍然在RC中.
从ADO.NET团队博客,我知道EF4.1 不包括:
根据我的理解,由于我将使用Database First,因此未包含的功能数量较少.
总之,我的问题是:
我可以用EF4.1 DbContext Generator 替换POCO实体生成器吗?
我有简单的实体:
public class Hall
{
[Key]
public int Id {get; set;}
public string Name [get; set;}
}
Run Code Online (Sandbox Code Playgroud)
然后在Seed我AddOrUpdate用来填充表的方法中:
var hall1 = new Hall { Name = "French" };
var hall2 = new Hall { Name = "German" };
var hall3 = new Hall { Name = "Japanese" };
context.Halls.AddOrUpdate(
h => h.Name,
hall1,
hall2,
hall3
);
Run Code Online (Sandbox Code Playgroud)
然后我在Package Management Console中运行:
Add-Migration Current
Update-Database
Run Code Online (Sandbox Code Playgroud)
一切都很好:我在"Hall"表中有三行.但如果我Update-Database再次在Package Management Console中运行,我已经有五行:
Id Name
1 French
2 Japaneese
3 German
4 …Run Code Online (Sandbox Code Playgroud) 当我尝试将实体附加到上下文时,我得到一个例外
ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象
这是预期的行为.
但我想知道ObjectStateManager是如何知道的?我之前想自己做这个检查
目前,当我需要运行将使用w/paging的查询时,我会这样做:
//Setup query (Typically much more complex)
var q = ctx.People.Where(p=>p.Name.StartsWith("A"));
//Get total result count prior to sorting
int total = q.Count();
//Apply sort to query
q = q.OrderBy(p => p.Name);
q.Select(p => new PersonResult
{
Name = p.Name
}.Skip(skipRows).Take(pageSize).ToArray();
Run Code Online (Sandbox Code Playgroud)
这有效,但我想知道是否有可能在使用linq时提高效率更高效?我想不出一种方法可以使用存储过程将数据检索的计数与数据检索结合到数据库中.
entity-framework entity-framework-4 c#-4.0 entity-framework-4.1
我正在将Entity Framework 4用于一个简单的应用程序,并希望将我的连接凭据烘焙到以下连接字符串中:
<connectionStrings>
<add name="MyEntities"
connectionString="metadata=res://*/MyDataModel.csdl|res://*/MyDataModel.ssdl|res://*/MyDataModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=localhost\DEV;Initial Catalog=MyDB;UserId=myUser;Password=jack&jill;MultipleActiveResultSets=True""
providerName="System.Data.EntityClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
但是,密码(我无法更改)包含&符号.ASP.NET抛出:
Configuration Error: An error occurred while parsing EntityName. Line XX, position YYY.
如果我用密码替换密码中的&符号&,我得到一个SqlException: Login failed for user 'myUser'. 通常这个技巧可行,但我猜测某些东西是失败的,因为这在技术上是连接字符串中的连接字符串.
我该怎么办?我的大多数课程包括以下代码:
using (var context = new MyEntities()) {
// do work
}
Run Code Online (Sandbox Code Playgroud)
更新: 事实证明我使用的凭据是域帐户,所以我真正需要的是Integrated Security=True连接字符串而不是密码.
按照接受的答案中的指示对&符号进行编码应该可以正常工作,尽管我还没有测试过.
c# ×6
.net ×1
asp.net ×1
c#-4.0 ×1
database ×1
dbcontext ×1
lazy-loading ×1
sql-server ×1
temp-tables ×1