Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用连接表和EF中的主键在同一个表上建立多对多关系_Entity Framework_Many To Many_Primary Key - Fatal编程技术网

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

我希望能够通过EF访问与主要子选项相关的所有次要子选项,反之亦然。直接使用
.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);