向大多数列表添加项目有3种方法...
Add(SomeType)
IList<T>.Add(T)
接口IList.Add(object)
接口方法你通常期望他们的行为或多或少相同.然而,LINQ EntitySet<T>
是......在3.5和4.0上都很奇怪; 该IList
API 不会标志设定为"分配" -其他两种机制做 -这听起来微不足道,但它是因为它极大地影响系列化重要(即导致其跳过)的样板代码.
例:
EntitySet<string> set1 = new EntitySet<string>();
set1.Add("abc");
Debug.Assert(set1.Count == 1); // pass
Debug.Assert(set1.HasLoadedOrAssignedValues, "direct"); // pass
EntitySet<string> set2 = new EntitySet<string>();
IList<string> typedList = set2;
typedList.Add("abc");
Debug.Assert(set2.Count == 1); // pass
Debug.Assert(set2.HasLoadedOrAssignedValues, "typed list"); // pass
EntitySet<string> set3 = new EntitySet<string>();
IList untypedList = set3;
untypedList.Add("abc");
Debug.Assert(set3.Count == 1); // pass
Debug.Assert(set3.HasLoadedOrAssignedValues, "untyped list"); // FAIL
Run Code Online (Sandbox Code Playgroud)
现在......这让我感到非常惊讶; 以至于我花了2个多小时跟踪代码以隔离发生的事情.所以... …
我在RIA服务(VS2010Beta2)中迈出了第一步,我遇到了这个问题:创建了一个EF模型(没有POCO),它上面的通用存储库和一个RIA服务(托管在ASP.NET MVC应用程序中)并试图获取数据从ASP.NET MVC应用程序:运作良好.下一步:Silverlight客户端.获得了对RIAService(通过其上下文)的引用,查询了存储库的所有记录并将它们也引入了SL应用程序(使用此代码示例):
private ObservableCollection<Culture> _cultures = new ObservableCollection<Culture>();
public ObservableCollection<Culture> cultures
{
get { return _cultures; }
set
{
_cultures = value;
RaisePropertyChanged("cultures");
}
}
Run Code Online (Sandbox Code Playgroud)
....
//Get cultures
EntityQuery<Culture> queryCultures = from cu in dsCtxt.GetAllCulturesQuery()
select cu;
loCultures = dsCtxt.Load(queryCultures);
loCultures.Completed += new EventHandler(lo_Completed);
Run Code Online (Sandbox Code Playgroud)
....
void loAnyCulture_Completed(object sender, EventArgs e)
{
ObservableCollection<Culture> temp=
new ObservableCollection<Culture>loAnyCulture.Entities);
AnyCulture = temp[0];
}
Run Code Online (Sandbox Code Playgroud)
问题在于:每当我尝试编辑记录的某些数据时(在本例中为第一条记录),我都会收到此错误:"Culture"类型的EntitySet不支持"编辑"操作.
我认为我做了一些奇怪的事情,并试图创建一个Culture类型的对象并为其赋值:它工作得很好!
我错过了什么?我必须声明一个EntitySet吗?我必须标记它吗?我必须......什么?
提前致谢
如何将a转换System.Collections.Generic.List<T>
为System.Data.Linq.EntitySet<T>
?
我使用LINQ-to-SQL从具有一对多关系的两个表的数据库加载数据(一个Recipe有许多成分).
我加载一个Recipe,LINQ将Ingredient对象检索到绑定到ListBox的EntitySet中.
如果我想从食谱中删除一些成分,我会得到一个"尝试删除食谱和成分之间的关系.但是,其中一个关系的外键(Ingredient.RecipeID)不能设置为null.
我通过在DBML文件中添加'DeleteOnNull ="true"'使用众所周知的解决方案解决了这个问题.但添加此设置仅在我们删除从DB检索到的Ingredient对象时才会消除此问题.
问题在于在代码中创建的成分对象(添加到配方中)并添加到成分的EntitySet集合中,然后在调用SubmitUpdates之前删除.然后,再次发生同样的异常.这通常发生在一个新的,未保存的食谱上,当用户向其添加成分,出错并从食谱中删除一种成分时.我将DeleteOnNull添加到DBML中的'Association Name ="Recipe_Ingredient"'行.
我该如何删除这些物品?我目前看到的唯一解决方案是,我会将成分加载到不在DataContext下的集合中,然后在保存时,删除配方中的所有成分,然后再从该缓存中添加..
这个问题让我疯了好几个小时了......
在我的领域,我有2个是彼此相关的其他实体Sku
和Item
.每个sku可以有很多项目.
public class Sku
{
private readonly EntitySet<Item> items;
public Sku()
{
items = new EntitySet<Item>(AttachItems, DetachItems);
}
public int SkuId { get; set; }
public string LongDescription { get; set; }
public EntitySet<Item> Items
{
get { return items; }
set{ items.Assign(value);}
}
private void AttachItems(Item entity)
{
entity.Sku = this;
}
private static void DetachItems(Item entity)
{
entity.Sku = null;
}
}
public class Item
{
public Sku Sku { get; set; } …
Run Code Online (Sandbox Code Playgroud) 好的,所以我有一个强类型的客户"详细信息"视图,它采用Customer对象模型.
我正在使用LINQ to SQL,每个客户都可以拥有多个(停车)空间.
这是数据库中的FK关系,因此我的LINQ生成的Customer模型具有"Spaces"集合.大!
这是来自我的CustomerRepository的代码片段,我遍历客户的停车位以删除所有付款,空间,最后是客户:
public void Delete(Customer customer)
{
foreach (Space s in customer.Spaces)
db.Payments.DeleteAllOnSubmit(s.Payments);
db.Spaces.DeleteAllOnSubmit(customer.Spaces);
db.Customers.DeleteOnSubmit(customer);
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作!
现在在我的"详细信息"视图中,我想用客户的空间填充表格:
<% foreach (var s in Model.Spaces)
{ %>
<tr>
<td><%: s.ID %></td>
<td><%: s.InstallDate %></td>
<td><%: s.SpaceType %></td>
<td><%: s.Meter %></td>
</tr>
<% } %>
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
foreach语句不能对'System.Data.Linq.EntitySet'类型的变量进行操作,因为'System.Data.Linq.EntitySet'不包含'GetEnumerator'的公共定义
最后,如果我将这段代码添加到我的Customer部分类中并使用视图中的foreach迭代ParkingSpaces,一切都按预期工作:
public IEnumerable<Space> ParkingSpaces
{
get
{
return Spaces.AsEnumerable();
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我不想重复自己.我也在想我可以使用ViewModel将Spaces集合传递给View,但是LINQ已经推断并在Customer模型上创建了Spaces属性,所以我认为只使用它是最干净的.
我错过了一些简单的事情,或者我是否正确地接近这个?
谢谢!
MSDN文档声明EntitySet实现IBindingList
(请参阅http://msdn.microsoft.com/en-us/library/bb546190.aspx上的 "绑定到EntitySets" )
但是,可以清楚地看到EntitySet没有实现此接口!
那我怎么排序?
对于上下文,我将此集绑定到WPF ListView.
对于我试图解决的问题的更广泛的背景,请看这篇文章.
我对 DBMS 中的实体和实体集感到困惑。实体集构成实体集吗?就像学生数组中的一组学生对象一样。
我们应该将关系数据库中的表与实体集或实体进行比较吗? 如果我将实体集与表进行比较,那么我可以将实体作为表中的记录进行比较。 如果我错了请纠正我。
我浏览了一些与此相关的书籍和博客。有时实体与 Rdbms 中的表进行比较,有时与实体集进行比较。这是真的。无法得到正确的解释。
请提供示例和清晰的解释,提前致谢!
entityset ×9
linq-to-sql ×4
c# ×3
linq ×3
.net ×2
data-binding ×2
asp.net-mvc ×1
database ×1
entity ×1
object ×1
oop ×1
rdbms ×1
set ×1
sorting ×1