Entity framework 使用连接表和EF中的主键在同一个表上建立多对多关系
我有以下表格:Entity framework 使用连接表和EF中的主键在同一个表上建立多对多关系,entity-framework,many-to-many,primary-key,Entity Framework,Many To Many,Primary Key,我有以下表格: Sub\u Option:Sub\u Option\u ID作为主键,Name Sub_Option_To_Sub_Option:Sub_Option_To_Sub_Option_ID作为主键,Sub_Option_ID_Primary,Sub_Option_ID_Secondary 我希望能够通过EF访问与主要子选项相关的所有次要子选项,反之亦然。直接使用.Map将不起作用,因为连接表Sub_选项到_Sub_选项具有主键 public class Sub_Option {
:Sub\u Option
作为主键,Sub\u Option\u ID
Name
:Sub_Option_To_Sub_Option
作为主键,Sub_Option_To_Sub_Option_ID
,Sub_Option_ID_Primary
Sub_Option_ID_Secondary
.Map
将不起作用,因为连接表Sub_选项到_Sub_选项
具有主键
public class Sub_Option
{
public int Sub_Option_ID { get; set; }
public string Name { get; set; }
}
对应于表
CREATE TABLE Sub_Option(
Sub_Option_ID int,
Name varchar(255)
);
和桌子
CREATE TABLE Sub_Option_To_Sub_Option(
Sub_Option_To_Sub_Option int PK,
Sub_Option_ID_Primary int,
Sub_Option_ID_Secondary int
);
我认为这应该行得通:
public class OptionToOption
{
[Key]
public int ID { get; set; }
[ForeignKey("PrimaryOption")]
public int PrimaryID { get; set; }
[ForeignKey("SecondaryOption")]
public int SecondaryID { get; set; }
public virtual Option PrimaryOption { get; set; }
public virtual Option SecondaryOption { get; set; }
}
public class Option
{
public Option()
{
OptionToOption = new HashSet<OptionToOption>();
}
[Key]
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<OptionToOption> OptionToOption { get; set; }
}
公共类选项选项
{
[关键]
公共int ID{get;set;}
[ForeignKey(“PrimaryOption”)]
公共int PrimaryID{get;set;}
[外键(“第二选项”)]
public int SecondaryID{get;set;}
公共虚拟选项PrimaryOption{get;set;}
公共虚拟选项第二个选项{get;set;}
}
公共类选项
{
公共选择权()
{
OptionToOption=新的HashSet();
}
[关键]
公共int ID{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection选项选项{get;set;}
}
在像这样的fluent api映射中(甚至不认为有必要这样做):
modelBuilder.Entity()
.HasMany(e=>e.optionOption)
.WithRequired(e=>e.PrimaryOption)
.HasForeignKey(e=>e.PrimaryID);
modelBuilder.Entity()
.HasMany(e=>e.optionOption)
.WithRequired(e=>e.Secondary选项)
.HasForeignKey(e=>e.SecondaryID);
Post te code和您所拥有的映射正在使用和未使用两个虚拟ICollection属性,并将它们映射到fluent api中的多对多。添加了结构。例如,要获取ID=5的primaryoption的所有Secondaryoptions:var secondary=db.Options。其中(o=>o.ID==5)。选择many(o=>o.optionOption.Select(s=>s.SecondaryOption).ToList();你知道了。谢谢!只是出于好奇,你需要fluent api吗?
modelBuilder.Entity<Option>()
.HasMany(e => e.OptionToOption)
.WithRequired(e => e.PrimaryOption)
.HasForeignKey(e => e.PrimaryID);
modelBuilder.Entity<Option>()
.HasMany(e => e.OptionToOption)
.WithRequired(e => e.SecondaryOption)
.HasForeignKey(e => e.SecondaryID);