我试图从一个类中获得一些重用,该类保存了许多实体之间的多对多关系数据。
你可以很容易地做到这一点,其中关系只是使用Map
的两个实体的pksclass A{
icollection<Item> Items
}
class B{
icollection<Item> Items
}
class Item{
string Text
}
然后在配置中你做这样的事情
Entity<A>().HasMany(e=>e.Items).WithMany().Map(..);
Entity<B>().HasMany(e=>e.Items).WithMany().Map(..);
这会为A和B
生成一个新的链接表现在,我想在链接表上存储更多信息,但这很常见
class A{
icollection<LinkItem> Items
}
class B{
icollection<LinkItem> Items
}
class LinkItem{
int ExtraInfo
Item Text
}
class Item{
string Text
}
由于LinkItem是在单个表中创建并且抱怨关系
,因此失败“'DataContext.LinkItem'中的实体参与'A_Items'关系。找到0个相关的'A_Items_Source'。1'A_Items_Keywords_Source'是预期的。”
您可以在Map方法中指定一个表,m.ToTable(“AItems”),但这也会失败
“在模型中找不到指定的表'AItems'。确保已正确指定表名。”
我可以以某种方式重用我的LinkItem类吗?
(它不需要作为DataContext中的集合进行访问)
答案 0 :(得分:1)
我相信你想做的事情,我刚尝试使用EF5,使用以下型号。
public class UsersContext : DbContext
{
public DbSet<A> As { get; set; }
public DbSet<B> Bs { get; set; }
public DbSet<LinkItem> LinkItems { get; set; }
public DbSet<Item> Items { get; set; }
}
public class A{
public virtual int Id { get; set; }
public virtual ICollection<LinkItem> Items { get; set; }
}
public class B{
public virtual int Id { get; set; }
public virtual ICollection<LinkItem> Items { get; set; }
}
public class LinkItem{
public virtual int Id { get; set; }
public virtual DateTime ExtraInfo { get; set; }
public virtual Item Text { get; set; }
}
public class Item{
public virtual int Id { get; set; }
public virtual string Text { get; set; }
}
这导致了以下数据库模型
我没有添加任何自定义映射,只使用了模型推断的内容。这对你有用吗?
如果要避免LinkItems表上外键的增加,可以使用以下DbModelBuilder
命令将它与实体A和B建立多对多关系,这将添加隐式链接表。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<A>()
.HasMany(t => t.Items)
.WithMany();
modelBuilder.Entity<B>()
.HasMany(t => t.Items)
.WithMany();
}