C# 有没有办法先从ef代码中的entry.Collection中获取每个值?
我目前拥有以下代码:C# 有没有办法先从ef代码中的entry.Collection中获取每个值?,c#,.net,entity-framework,ef-code-first,entity,C#,.net,Entity Framework,Ef Code First,Entity,我目前拥有以下代码: System.Reflection.PropertyInfo[] names = _entity.GetType().GetProperties(); var entry = this.Entry(_entity); foreach (var property in names) { var m = entry.Member(property.Name);
System.Reflection.PropertyInfo[] names = _entity.GetType().GetProperties();
var entry = this.Entry(_entity);
foreach (var property in names)
{
var m = entry.Member(property.Name);
if (m is DbPropertyEntry)//simple property
{
var p = entry.Property(property.Name);
currentVal.Add(p.CurrentValue.ToString());
}
if (m is DbReferenceEntry)//navigation to single object
{
var r = entry.Reference(property.Name);
currentVal.Add(r.CurrentValue.ToString());
}
if (m is DbCollectionEntry)//navigation to collection
{
var c = entry.Collection(property.Name);
currentVal.Add(c.CurrentValue.ToString());
}
}
我想从与实体关联的集合中获取每个字段值,但entry.collection(property.Name)只返回集合名称,而不返回集合中的字段,如名称、id等。。因此,我无法实际获取集合中的当前值
非常感谢您的任何建议!
谢谢
编辑:
我正在使用的实体的设置如下:
public class Project
{
public int Id { get; set; } // PK
public string Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int MarketId { get; set; } // FK
[ForeignKey("MarketId")]
public Market Market { get; set; } // FK Nav
public ICollection<Team> Teams { get; set; } // Many to Many Nav
}
公共类项目
{
公共int-Id{get;set;}//PK
公共字符串名称{get;set;}
公共日期时间起始日期{get;set;}
公共日期时间结束日期{get;set;}
public int-MarketId{get;set;}//FK
[外汇(“市场化”)]
公开市场{get;set;}//FK Nav
公共ICollection团队{get;set;}//多对多导航
}
我想查看的有问题的集合是团队,我正在对该实体执行审核,当创建新项目时,我想在团队表中查看关联项目id的更新值,我想您需要基于字符串数组进行选择,这些字符串是属性的名称。我说得对吗 您是否尝试过使用Linq Dynamic。它允许您使用字符串表达式构造LINQ查询
var result = myQuery
.Select("new (Field1, Field2)");
//in your case
var result2 = myQuery
.Select("new (" + string.Join(fields, ', ') + ")");
这对您有帮助吗?如果我正确理解了您的问题,那么您希望循环查看实体集合中的项目。一种方法是将c.CurrentValue强制转换为IEnumerable,然后使用foreach循环遍历枚举
foreach(var x in (IEnumerable) c.CurrentValue){
// do something with the entity here
}
这将为您提供集合中的实体。根据您想对它们执行的操作,您可以将实体本身转换为字符串(),或者递归地使用您发布的代码来获取它们的属性值
需要注意的一点是,EF并不急于加载集合属性。因此,可能是集合在内存中是空的,而在数据库中不是空的。DbCollectionEntry类型有一个IsLoaded属性来检查这一点。您好,是的,我想从集合中选择属性名称并获取它们的当前值。我不确定这些字段在您的anser中来自何处?您好,我尝试过使用foreach,但它仍然没有给我任何值。我可以提取的唯一信息是长集合名称,而在locals窗口中,我可以清楚地看到集合模型中的每个字段以及每个.c.CurrentValue.ToString()的值给我类似这样的信息:System.Collections.Generic.HashSet`1[EntityType]。这是一个实体集合。使用foreach可以为我提供如下所示的每个实体(或者更确切地说是一个动态代理{System.Data.Entity.DynamicProxies.EntityType_BLABLA。这是集合中一个实体的实例。我不确定获取集合中实体的属性是否有意义。我已更新了上面的问题,以显示我正在使用的实体以及为什么要关联集合的值。我不确定您是否在标题中在正确的设计方向上。虽然在不了解更高层次的需求的情况下很难说。如果您想要相关团队的值,那么您可以通过集合中的团队
foreach
,然后使用与原始代码类似的代码来获取其属性值。但是,我的feeling建议您首先检查您的设计。抱歉,我没有得到更多帮助。您好,我使用foreach并使用上面的代码提取值,这不是一个伟大的设计,我只是一个刚毕业的学生!感谢您的建议,它将我推向了正确的方向什么是currentVal
?您甚至想添加所有fi的字符串entry.Collection
中的ELD?这是一个奇怪的要求。Hi currentVal是用于存储当前值的列表,例如entry.Property的Id为currentVal 2,名称为currentVal test等。我希望从与此实体关联的集合中获得相同的信息,但我似乎无法以相同的方式提取此信息我应该提到这是为了审计的目的,我需要看到这个实体的变化以及它的集合的变化,这是一对多的关系