我是新编码的人.现在我要告诉你我目前的情况以及我想去的地方.希望你会帮忙.
我正在使用EF5.0数据库第一种方法,我希望能够使用gridviews列出和更新数据库值.
目前我正在绑定我的数据,如下所示:
pehlivan_kabametrajEntities ctx = new pehlivan_kabametrajEntities();
var result = from k in ctx.Kolons
select k;
dataGridView1.DataSource = result.ToList();
Run Code Online (Sandbox Code Playgroud)
此代码完美地列出了我的数据.但是对我的需求来说是错误的还是不够的.因为我希望能够在gridview上编辑我的数据.请告诉我有什么问题,我应该怎么做.至少链接的一些文件会让我到达我想要的目的地点,这将是很棒的.谢谢.
我现在首先在一个简单的测试应用程序中使用EF5代码来测试各种功能.我已经在两个代表一对多链接的实体之间定义了"识别关系".在这里,我定义了一个具有许多子Photo实体的PhotoCollection;
public class PhotoCollection
{
public int Id { get; set; }
public virtual ISet<Photo> Photos { get; private set; }
public PhotoCollection()
{
Photos = new HashSet<Photo>();
}
}
public class Photo
{
[Key, ForeignKey("Parent"), Column(Order = 1)]
public int PhotoCollectionId { get; set; }
[Key, Column(Order = 2)]
public int PhotoId { get; set; }
public virtual PhotoCollection Parent { get; set; }
[Required, MaxLength(200)]
public string FilePath { get; set; }
public Photo()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我的OnModelCreating实现包括; …
entity-relationship one-to-many ef-code-first entity-framework-5
同志们,任何人都可以帮助我,实体框架5似乎没有ApplyCurrentValues()方法.是否有另一种方法来更新实体框架v5中的数据库对象.这是我想要做的
odc.Accounts.Attach(new Account { AccountID = account.AccountID });
odc.Accounts.ApplyCurrentValues(account);
odc.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是我在ApplyCurrentValues()行中遇到了编译错误
我试图在我的LINQ查询中外连接一个带有内联表值函数的表,但是我在运行时遇到了一个查询编译错误:
"查询尝试通过嵌套查询调用'OuterApply',但'OuterApply'没有相应的密钥."
我的linq语句如下所示:
var testQuery = (from accountBase in ViewContext.AccountBases
join advisorConcatRaw in ViewContext.UFN_AccountAdvisorsConcatenated_Get()
on accountBase.AccountId equals advisorConcatRaw.AccountId into advisorConcatOuter
from advisorConcat in advisorConcatOuter.DefaultIfEmpty()
select new
{
accountBase.AccountId,
advisorConcat.Advisors
}).ToList();
Run Code Online (Sandbox Code Playgroud)
功能定义如下:
CREATE FUNCTION dbo.UFN_AccountAdvisorsConcatenated_Get()
RETURNS TABLE
AS
RETURN
SELECT AP.AccountId,
LEFT(AP.Advisors, LEN(AP.Advisors) - 1) AS Advisors
FROM ( SELECT DISTINCT
AP.AccountId,
( SELECT AP2.PropertyValue + ', '
FROM dbo.AccountProperty AP2 WITH (NOLOCK)
WHERE AP2.AccountId = AP.AccountId
AND AP2.AccountPropertyTypeId = 1 -- Advisor
FOR XML PATH('')) AS Advisors
FROM dbo.AccountProperty AP …Run Code Online (Sandbox Code Playgroud) 在尝试读取记录时,我一直在与EF斗争,然后在同一个事务中删除这些记录.我最初使用的是EntityState.Deleted方法,它会产生错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
但是,如果我将它改为我在下面,使用.Remove(),那么一切都很好.
这是有问题的方法.请注意,我确实有一个使用.Deleted方法的通用存储库,该方法在此方案之前一直很好用(读取然后删除相同的记录.)
//Delete Allocation Need and AllocatedContainers for alloc need id
public ActionConfirmation<int> DeleteAllocRecords(int intFacilityId, AllocNeedSourceTypes needSourceType, int intNeedSourceId)
{
var context = new InventoryMgmtContext();
var repository = new AllocationNeedRepository(context);
//Delete Allocation Need and hence children in Allocated Containers
var srcType = needSourceType.ToString();
List<AllocationNeed> allocNeeds = repository.SearchFor(
x => x.FacilityId == intFacilityId
&& x.NeedSourceType == srcType
&& x.NeedSourceId == intNeedSourceId
).ToList();
//var deleteRepository = new Repository<AllocationNeed>(); <--tried separate instance of context to delete...no worky.
foreach …Run Code Online (Sandbox Code Playgroud) .net c# entity-framework exception-handling entity-framework-5
我正在使用Entity Framework Database First,但我想从Code First范例中复制以下行为:
在实体框架代码中,您可以按照以下方式执行操作:
public class Thing
{
public int ID { get; set; }
ICollection<Stuff> Stuffs { get; set; }
}
public class Stuff
{
public int ID { get; set; }
ICollection<Thing> Things { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并且数据库将生成和Associative表来表示多对多的关系.
我正在使用Database First和遗留数据库.我引入了实体,它包含了表示两个表之间多对多关系的关联表.
由于关联表作为实体包含在内,因此导航属性如下:
public class Thing
{
public int ID { get; set; }
public ICollection<ThingStuff> ThingStuffs { get; set; }
}
public class ThingStuff
{
public int ThingID { get; set; }
public int StuffID { …Run Code Online (Sandbox Code Playgroud) entity-framework database-first ef-database-first .net-4.5 entity-framework-5
所以我知道iQueryables被翻译成SQL语句,因此无法处理你可能放入where子句的所有可能的方法.
但这就是我要做的事情:
int[] alreadySelectedIds = ...
var subjects = Entities.NewInstance.Subjects.Where(x => Array.IndexOf(alreadySelectedIds, x.Id) == -1).ToList();
Run Code Online (Sandbox Code Playgroud)
阅读下面的帖子,我很高兴EF5能够翻译这个.
获取其键匹配id列表(或数组)的实体
使用LINQ从数组查询Int Ids
但是,我收到此错误:
LINQ to Entities无法识别方法'Int32 IndexOf [Int32](Int32 [],Int32)'方法,并且此方法无法转换为存储表达式.
谷歌搜索这个错误并没有给我太多帮助.
我也试过了
var newSubjects = Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList();
Run Code Online (Sandbox Code Playgroud)
无法创建类型为"System.Int32 []"的空常量值.在此上下文中仅支持实体类型,枚举类型或基元类型.
和
List<int> alreadySelectedIds = ...
Run Code Online (Sandbox Code Playgroud)
无法创建类型为"System.Collections.Generic.List`1"的空常量值.在此上下文中仅支持实体类型,枚举类型或基元类型.
我被困住了,我的大脑变得糊涂,超出了任何类型的优雅恢复的可能性.有人可以救我吗?
我正在使用本地机器(ASP.NET MVC 4应用程序),但现在我想开始使用公司的SQL服务器,所以我需要更改连接字符串以便将我连接到该远程服务器.
设置如下:
Microsoft SQL Server Management Studio用来连接到远程服务器时,我使用与用于连接VPN的相同IP - xxx.xxx.xxx.xxx我有一个现有的连接字符串,我用它连接到我的电脑上的服务器,所以我认为只需改变那里的参数即可:
<add name="ProjectName.DAL.MyDbContext"
providerName="System.Data.SqlClient"
connectionString="Data Source=xxx.xxx.xxx.xxx;
Initial Catalog=DatabaseName;Integrated Security=True;
MultipleActiveResultSets=True;
user id=SQLUsername;password=SQLPassword;App=EntityFramework" />
Run Code Online (Sandbox Code Playgroud)
因此,工作连接字符串并将我连接到本地服务器的更改有两个:
Data Source= xxx.xxx.xxx.xxx - 我正在使用IP.在这里,我想知道IP本身是否足够.我应该使用http://xxx.xxx.xxx.xxx还是IP就可以了?user id=SQLUsername;pasword=SQLPassword- 我使用相同的用户名和密码Management studio,因为我可以通过提供xxx.xxx.xxx.xxx服务器名称和使用SQLUsername/SQLPassword 成功连接到删除服务器SQL Server Authentincation.所以要清楚 - 在Management Studio下我连接到远程服务器没有问题.但是,当我将连接字符串更改为我在上面发布的内容时,我的HomeController逻辑非常简单,只是为了检查是否执行了对数据库的调用:
private MyDbContext db = new MyDbContext();
//
// GET: /Home/
public ActionResult Index()
{
return View(db.Users.ToList()); …Run Code Online (Sandbox Code Playgroud) 当我对SQL表使用Entity Framework时,它只引用生成的SQL中的必要列:
ctx.Types.Select(rdi => rdi.Name)
Run Code Online (Sandbox Code Playgroud)
变
SELECT [Extent1].[Name] AS [Name]
FROM [dbo].[Types] AS [Extent1]
Run Code Online (Sandbox Code Playgroud)
但是,如果我对SQL视图进行类似的查询,Entity Framework将生成引用视图中每个列的 SQL :
ViewTypes.Select(rdi => rdi.Name)
Run Code Online (Sandbox Code Playgroud)
变
SELECT [Extent1].[Name] AS [Name]
FROM (SELECT
[ViewTypes].[Name] AS [Name],
... every other column in my view ...
FROM [dbo].[ViewReferenceDataTypes] AS [ViewReferenceDataTypes]) AS [Extent1]
Run Code Online (Sandbox Code Playgroud)
我确信SQL Server将执行自己的优化,最终忽略它不关心的所有列,但这仍然会导致大量的SQL发送到服务器.(我的实际例子包括一个连接,这导致选择了几个表中的每一列......)
Entity Framework是否有充分理由这样做?有没有办法让它不这样做?
我有一个在IIS7上运行的ASP.NET MVC-4,Entity Framework 5应用程序,带有SQL Server 2012数据库.
每天,在7:45到8:15之间,数百名用户执行相同的日常日常任务.而且表现很糟糕.我们到处都是超时的.
所以今天我坐着看几个诊断工具.在SQL Server Profiler上,我看到数百个查询在30秒后超时.我复制了查询并将其放入SQL Sentry中以查看查询计划中发生了什么.30分钟后,查询最终执行,显示了一个完全无懈可击的低效执行计划.索引扫描返回了数千万条记录,这些记录应该通过较早的连接过滤到数十,甚至数百条记录.
与此同时,我正在检查性能监视器以进行其他诊断.CPU正在以20-30%的舒适度巡航,我们有256 GB的RAM,其中大约200个为SQL Server保留,并且不缺乏工作内存.没有重要的数据库锁定,没有死锁.只是可怕,糟糕的表现.
所以后来我尝试运行完全相同的查询.它在大约0.1秒内回来了.查询计划看起来完全不同:一切都是索引搜索,细线和一切.我在SQL事件探查器中捕获的所有其他查询在7:45-8:15之间花费了5秒钟,现在每秒返回0.1秒以下.
我们每天都在同一时间窗口内遇到同样的问题.我该如何解决此问题?我认为在不同时间执行查询时,不同的查询计划可能会有一些线索; 这可能与SQL统计数据有关吗?如果是这样,我们如何解决它?
编辑:我接受了@t_m的建议并部署了一个DMV脚本.现在,我可以确定在查询超时时遵循了什么执行计划,以及它在工作时遵循的计划.