2015-12-14 63 views
1

我用以下几个实体:EF 6检索父母对儿童自动生成的外键

public class Store { 
    public int Id { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<Promotion> Promotions { get; set; } 
} 

public class Product { 
    [product properties here...] 
} 

public class Promotion : Product { 
    [extra promotion properties here...] 
} 

通过使用代码首先,它生成我的数据库。它使用鉴别器(为了区分它存储的类型)生成一个产品表,然后生成Store_Id外键,该外键在产品时填充,而在使用促销时使用另一个Store_Id1。

现在,过了一段时间,我需要从特定促销活动中访问商店。如何做呢?我尝试使用Fluent并告诉它关于外键,但我失败了。

你们能为我带来一些启示吗?

感谢,

+0

我不明白你的数据库模型。你是说你在一个产品中有商店?如果你在两个不同的商店有同样的产品会怎么样?我认为你需要先在你的模型上多加努力...... – jpgrassi

+0

对我来说这是不可能的,所以它是可以的。无论如何,不​​管模型的设计如何,问题仍然存在:( –

+0

显示你在你的查询中试过的东西 – jpgrassi

回答

3

这不仅仅是一个简单的多对一关系?然后

public int StoreID { get; set; } 
public virtual Store Store { get; set; } 
public int Store1ID { get; set; } 
public virtual Store Store1 { get; set; } 

modelBuilder.Entity<Store>() 
      .HasMany(m => m.Products) 
      .WithRequired(m => m.Store); 

modelBuilder.Entity<Store>() 
      .HasMany(m => m.Promotions) 
      .WithRequired(m => m.Store1); 

Product.StoreProduct.Store1也只是导航性能回到他们的商店。

+0

那是的东西!!非常感谢你! 我只是改变了可选的要求,一切工作顺利和相同的方式,它只是重新命名了一些列和索引 –

+0

我不相信它会表现出两个关系然而,你也可以避免在WithOptional之后使用.Map重命名。 –

0

我相信你建模可以改进... Promotion不应延长Product。你应该分开它们,对产品和商店有促销点(如果你想存储特定的促销)......这意味着ProductStore应该是Promotion实体中的一个字段......进一步扩展,想象一下,它看起来像是如果你想有一个促销涉及多个产品(例如:肥皂和洗发水,跑步运动鞋和袜子等......)

+0

谢谢!这似乎是一个好方法。无论哪种方式,我会遇到问题访问一个产品的商店。我只是想尝试托马斯答案。 –

+0

@ Pau24我编辑我的答案...检查出来 – Leonardo

+0

谢谢!我会考虑到 –