public class Entity1
{
public int Id { get; set; }
public Guid EntityKey { get; set; }
public ICollection<Entity2> Entity2s { get; set; }
}
public class Entity2
{
public int Id { get; set; }
public Guid EntityKey { get; set; }
}
public class EntityMapping
{
public int Id { get; set; }
public Guid ParentKey { get; set; }
public EntityType ParentType { get; set; }
public Guid ChildKey { get; set; }
public EntityType ChildType { get; set; }
}
我需要使用流畅的配置API执行以下操作:
select e2.* from Entity1 e1
join Entitymapping em on em.ParentKey == e1.EntityKey && em.ParentType == 'Entity1'
join Entity2 e2 on em.ChildKey == e2.EntityKey
我致电:entity1.Entity2s.ToList()
只有EF 4中的流畅配置才能实现这一点吗?
答案 0 :(得分:-2)
好的,首先。为什么不使用Id字段作为主要字段?由SQL Server维护为唯一等等。每个实体有两个密钥要求麻烦。
与我给出的here
完全相同的M-M答案您的实体需要一些工作。 Entity1 / Entity2导航属性应指向List&lt; EntityMapping&gt;和EntityMapping应指向Entity1&amp; 1中的每一个。 ENTITY2。它是1-1的Join表,其中每一方都可以很多,因此是多对多的。如果您希望所有Entity1及其关联的Entity2更像这样:
DbSet.Entity1.Include(&#34; EntityMapping&#34)。包含(&#34; EntityMapping.Entity2&#34)。ToList();
使用单个表来存储许多不同实体之间的关系,这些实体仍然可以使用类似的结构。会有一些&#34;幕后花絮#34;检查以强制执行1-1或1-M关系进入M-M模具,打赌这应该让你开始......
public class Entity1
{
public int Id { get; set; }
public Guid EntityKey { get; set; }
public EntityType E1Type { get; set; }
public ICollection<EntityMapping> Entity2s { get; set; }
}
public class Entity2
{
public int Id { get; set; }
public Guid EntityKey { get; set; }
public EntityType E2Type { get; set; }
public ICollection<EntityMapping> Entity1s { get; set; }
}
public class EntityMapping
{
public int Id { get; set; }
public int ParentKey { get; set; }
public int ChildKey { get; set; }
public Entity1 Entity1 { get; set; }
public Entity2 Entity2 { get; set; }
}
对于所有被称为&#34; Foo&#34; &#34; Bar&#34;子实体(假设Foo也可以与&#34; Widgets&#34相关;有一种EF&#34;方式&#34;这样做但是您正在拍摄的SQL SELECT是
select e1.EntityKey as e1Key, e2.EntityKey as e2Key from Entity1 e1
inner join EntityMapping e3 on e3.ParentKey = e1.Id
inner join Entity2 e2 on e2.Id = e3.ChildKey
where e1.E1Type = "Foo" and e2.E2Type = "Bar"
EF发言
var temp = DbSet.Entity1.Select(p => p.E1Type == "Foo").Include("EntityMapping").Include("EntityMapping.Entity2");
var result = temp.Where(r => r.E2Type == "Bar").ToList();
可能可能会将这些结合起来,但我必须修补而不是&#34;关闭袖口&#34;。那更好吗?