我为我的下一个项目使用Code First。我非常喜欢这个想法,迄今为止它的运作非常好。我唯一的牛肉是,我找不到任何关于如何使用这个野兽的文档,而谷歌搜索通常指的是现在过时的CTP。从POCO对象引用DbContext
对于这个问题,我将模拟一个有向图。 图遍历的算法不是最佳的。
我有一个简单的POCO结构,这样
class Graph : DbContext
{
public DbSet<Node> Nodes { get; set; }
public DbSet<Edge> Edges { get; set; }
public Graph(string connectionString) : base(connectionString) { }
}
class Edge
{
public int Id { get; set;}
public double Weight { get; set; }
public Node StartNode { get; set; }
public Node EndNode { get; set; }
}
class Node
{
public int Id { get; set; }
public string Label { get; set; }
}
简洁明快的东西。
但是现在假设我想向每个节点添加对Graph对象的某种引用,以便节点可以在图的上下文中找出有关它自身的信息,例如它有多少条边。
我希望我的节点,创建时,有
class Node
{
public int Id { get; set; }
public string Label { get; set; }
//I want this property populated by magic.
//Just leaving it here crashes the program
public Graph Graph { get; set; }
//So that this property would do meaningful things.
public int EdgesFromThisNode
{
get { return Graph.Edges.Count(e => e.StartNode.Id == Id); }
}
}
我认为我走出会议在这里解决这个我有一个特别的问题。例如,该属性可以作为方法移动到Graph类。我不想这样做的原因是因为我想绑定到这个属性,绑定是邪恶的。
你们其中的一个向导能够指导我将注释/实体类型配置魔术的正确组合拉到这个快速的一个吗?
是否有我应该注意的不同约定?例如,如果我以某种方式可以绑定所有的边或者更好,那么一些边(从节点发出的边)到达Node,那就更加优雅了。
在此先感谢您,如果您有任何Code First发烧友应该阅读的建议......首先,请分享您的链接!
谢谢你提供一个非常全面的答案,我将回顾我的实际问题以及这个解决方案如何适应它。你知道是否可以将Graph对象引用附加到每个节点?它味道不好吗? – Gleno 2011-04-23 19:17:48
那个12段教程真的很棒的人! – Gleno 2011-04-23 19:36:45
@格莱诺:对我来说,它的味道不好,是的。 “POCO”的想法是在其中没有持久性相关代码或参考。我在我的答案中附加了Edit2部分,作为您的绑定方案的替代解决方案,避免在模型类中具有上下文。我不知道这是否会满足您的所有要求。 – Slauma 2011-04-23 20:09:12