我把这缩小到Code First和Database first EF之间的一些问题,但我不确定如何修复它.我会尽量保持清醒,但老实说,我自己也缺少一些理解.这是实体框架4.4
我继承了一个使用Entity Framework的项目,但许多实际文件都被删除了,没有真正的方法可以返回.我重新添加了EF(数据库优先)并复制了项目所围绕的T4设置.它生成了所有数据库模型的代码版本和DBContext代码文件.
如果我的连接字符串看起来像一个"正常"的.NET连接字符串,我得到一个关于无效列的错误名称"ProcessState_ID"不存在.ProcessState_ID根本不在代码库中,它不在EDMX文件或任何内容中.这似乎是查询中的一些自动EF转换.
当我使连接字符串与实体框架模型匹配时,它工作正常.
现在尝试将以前的代码与实体框架相匹配,我想保留"正常"的.NET连接字符串.
所以我在这里有两个问题:1.在代码中从普通连接字符串到EF连接字符串的好方法是什么?2.这里有另一个修复,我没有看到停止无效的列名错误?
更新3:根据此公告,EF团队在EF6 alpha 2中已经解决了这个问题.
更新2:我已经创建了一个解决此问题的建议.要投票,请到这里.
考虑一个带有一个非常简单的表的SQL数据库.
CREATE TABLE Main (Id INT PRIMARY KEY)
Run Code Online (Sandbox Code Playgroud)
我用10,000条记录填充表格.
WITH Numbers AS
(
SELECT 1 AS Id
UNION ALL
SELECT Id + 1 AS Id FROM Numbers WHERE Id <= 10000
)
INSERT Main (Id)
SELECT Id FROM Numbers
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)
我为表构建EF模型并在LINQPad中运行以下查询(我使用"C#语句"模式,因此LINQPad不会自动创建转储).
var rows =
Main
.ToArray();
Run Code Online (Sandbox Code Playgroud)
执行时间约为0.07秒.现在我添加Contains运算符并重新运行查询.
var ids = Main.Select(a => a.Id).ToArray();
var rows =
Main
.Where (a => ids.Contains(a.Id))
.ToArray();
Run Code Online (Sandbox Code Playgroud)
这种情况的执行时间是20.14秒(慢288倍)!
起初我怀疑为查询发出的T-SQL需要更长的时间才能执行,因此我尝试将其从LINQPad的SQL窗格剪切并粘贴到SQL Server Management Studio中.
SET …Run Code Online (Sandbox Code Playgroud) 我有一个Entity Framework 4模型优先设计.我在设计师中创建了我的模型的初稿,一切都很顺利.我编译,生成数据库等.
后来我尝试将一个字符串标量(Nullable = true)添加到我现有的一个实体中,并在编译时遇到这种类型的错误:
错误3004:从第569行开始映射片段时出现问题:没有为Set MyEntities中的属性MyEntity.MyValue指定映射.具有密钥(PK)的实体在以下情况下不会往返:实体是类型[MyEntities.MyEntity]
每当我添加标量时,我都必须手动打开EDMX文件并更正XML.
关于发生了什么的想法?
有没有办法在实体框架中找出我的实体上下文中是否有未保存的更改?
entity-framework entity-framework-4 entity-framework-5 entity-framework-6
使用Entity Framework 4.3删除System.Data.Entity.DbSet中所有元素的最佳方法是什么?
我在Entity Framework Code First上使用Generic Repository模式.一切都工作正常,直到我需要在查询中包含更多实体.我成功地包含了一个实体,但现在我无法弄清楚如何包含多个实体.看看到目前为止我得到了什么:
public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
var entityName = GetEntityName<TEntity>();
return _objectContext.CreateQuery<TEntity>(entityName);
}
public IList<TEntity> GetQueryWithInclude<TEntity>(string toInclude) where TEntity : class
{
var entityName = GetEntityName<TEntity>();
return _objectContext.CreateQuery<TEntity>(entityName).Include(toInclude).ToList();
}
private string GetEntityName<TEntity>() where TEntity : class
{
return string.Format("{0}.{1}", _objectContext.DefaultContainerName, _pluralizer.Pluralize(typeof(TEntity).Name));
}
Run Code Online (Sandbox Code Playgroud)
我尝试但没有工作的是将一个字符串数组传递给一个函数,然后尝试在查询之上"追加"包含.我在想,如果我叫GetQueryWithInclude并在同一时间聚集查询的结果通过了实体名称(实际导航性能),但我担心这可能会重复在每次调用查询的结果...您认为最好的方法是什么?
提前致谢!
更新:
这是我想要实现的一个例子:
public IQueryable GetQueryWithIncludes(string[] otherEntities)
{
var entityName = GetEntityName<TEntity>();
//now loop over the otherEntities array
//and append Include extensions to the query
//so inside the loop, something …Run Code Online (Sandbox Code Playgroud) c# entity-framework repository-pattern entity-framework-4 ef-code-first
我正在使用实体框架(ef)并收到以下错误:
"查询的结果不能多次枚举."
我有一个包含ef数据上下文的存储库类.然后我有一个控制器类(不要与MVC控制器混淆),它包含一个存储库实例.到目前为止一直这么好......我在控制器上有一个搜索方法,它应该返回一个数组RadComboBoxItemData,用于填充Telerik RadComboBox控件.
public RadComboBoxItemData[] Search(int id, string searchText)
{
var query = context.Search(id, searchText);
List<RadComboBoxItemData> result = new List<RadComboBoxItemData>();
foreach (var item in query)
{
RadComboBoxItemData itemData = new RadComboBoxItemData();
itemData.Text = ""; // assign some text here..;
itemData.Value = ""; /*assign some value here..*/
result.Add(itemData);
}
return result.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
当我调试我的代码时,我可以进入foreach循环,但后来我得到一个错误说:
System.Data.Entity.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理
附加信息:查询结果不能多次枚举.
我的实体使用现有存储过程的函数导入.
// EF repository method calling the function imported method on the data context.
public IEnumerable<SearchItem> Search(int id, string searchText)
{
return this.entityContext.Search(id, …Run Code Online (Sandbox Code Playgroud) 请任何人帮我修复此错误?
指定的架构无效.错误:
CLR类型到EDM类型的映射是不明确的,因为多个CLR类型与EDM类型"City_DAL"匹配.之前发现CLR类型'CeossDAL.City_DAL',新发现的CLR类型'CeossBLL.City_DAL'.
我有DAL的主要问题,这包含EF和BLL,这包含相同的DAL类但名称空间不同,这就是导致问题的原因
我不知道怎么摆脱这些问题,能帮帮我吗?
如果有人给我示例使用带有EF的n层架构,我将不胜感激
谢谢
我正在尝试LINQ实体.
我有以下问题:我希望它这样做:
SELECT
T_Benutzer.BE_User
,T_Benutzer_Benutzergruppen.BEBG_BE
FROM T_Benutzer
LEFT JOIN T_Benutzer_Benutzergruppen
ON T_Benutzer_Benutzergruppen.BEBG_BE = T_Benutzer.BE_ID
Run Code Online (Sandbox Code Playgroud)
我最接近的是这个:
var lol = (
from u in Repo.T_Benutzer
//where u.BE_ID == 1
from o in Repo.T_Benutzer_Benutzergruppen.DefaultIfEmpty()
// on u.BE_ID equals o.BEBG_BE
where (u.BE_ID == o.BEBG_BE || o.BEBG_BE == null)
//join bg in Repo.T_Benutzergruppen.DefaultIfEmpty()
// on o.BEBG_BG equals bg.ID
//where bg.ID == 899
orderby
u.BE_Name ascending
//, bg.Name descending
//select u
select new
{
u.BE_User
,o.BEBG_BG
//, bg.Name
}
).ToList();
Run Code Online (Sandbox Code Playgroud)
但是这会产生与内部联接相同的结果,而不是左联接.
而且,它创建了这个完全疯狂的SQL:
SELECT
[Extent1].[BE_ID] AS [BE_ID] …Run Code Online (Sandbox Code Playgroud) c# linq linq-to-entities entity-framework entity-framework-4
var result =
(from bd in context.tblBasicDetails
from pd in context.tblPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
from opd in context.tblOtherPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
select new clsProfileDate()
{
DOB = pd.DOB
});
foreach (clsProfileDate prod in result)
{
prod.dtDOB = !string.IsNullOrEmpty(prod.DOB) ? Convert.ToDateTime(prod.DOB) : DateTime.Today;
int now = int.Parse(DateTime.Today.ToString("yyyyMMdd"));
int dob = int.Parse(prod.dtDOB.ToString("yyyyMMdd"));
string dif = (now - dob).ToString();
string age = "0";
if (dif.Length > 4)
age = dif.Substring(0, dif.Length - 4);
prod.Age = Convert.ToInt32(age);
}
GetFinalResult(result);
Run Code Online (Sandbox Code Playgroud)
protected void GetFinalResult(IQueryable<clsProfileDate> …Run Code Online (Sandbox Code Playgroud)