使用自定义键名映射泛型Many-Many

时间:2018-03-05 19:47:26

标签: c# entity-framework entity-framework-4

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中的流畅配置才能实现这一点吗?

1 个答案:

答案 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;。那更好吗?