C# NET MVC如何访问实体框架生成的外键?

C# NET MVC如何访问实体框架生成的外键?,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,歌曲与其自身有着多对多的关系。我将这些id存储在一个名为SimilarVersion的类中,该类具有两个id列 public class Song { public int Id { get; set; } public string AudioName { get; set; } public string ArtistName { get; set; } ... public virtual ICollection<SimilarVers

歌曲
与其自身有着多对多的关系。我将这些id存储在一个名为
SimilarVersion
的类中,该类具有两个id列

public class Song
{
    public int Id { get; set; }

    public string AudioName { get; set; }

    public string ArtistName { get; set; }

    ...

    public virtual ICollection<SimilarVersion> SimilarVersions { get; set; } = new List<SimilarVersion>();      
}

public class SimilarVersion
{
    public int Id { get; set; }

    public int? Song_Id1 { get; set; }
}
编辑。试图根据仰慕者的回答添加到一行:

var songToUpload = new Song
{
    AudioName = uploadSongDtos[i].AudioName.Trim(),
    ArtistName = uploadSongDtos[i].ArtistName,                        
};

 foreach (var compareAgainstString in _songService.GetSongs().ToDictionary(x => x.Id, x => x.AudioName))
 {
       var score = SearchContext.Levenshtein.iLD(songToUpload.AudioName, compareAgainstString.Value);

       //Don't add the current song
       if (score < 50 && songToUpload.Id != compareAgainstString.Key)
           songToUpload.SimilarVersionsWhereSimilar.Add(new SimilarVersion { SimilarId = compareAgainstString.Key });
 }
var songToUpload=新歌
{
AudioName=uploadSongDtos[i]。AudioName.Trim(),
ArtistName=uploadSongDtos[i]。ArtistName,
};
foreach(在_songService.GetSongs().ToDictionary(x=>x.Id,x=>x.AudioName)中的var compareAinstString)
{
var score=SearchContext.Levenshtein.iLD(songToUpload.AudioName,compareAinstString.Value);
//不要添加当前歌曲
if(分数<50&&songToUpload.Id!=compareAinstString.Key)
songToUpload.similarversionwheresimilar.Add(新的SimilarVersion{SimilarId=compareAinstString.Key});
}

OriginalId
SimilarId
都被分配给
songToUpload的id。id
被赋予了我们在模型中定义的关系,这对于
OriginalId
是正确的,但它也覆盖了我上面的自定义集
SimilarId
。如何停止此操作?

可能该ID实际上是由您的商店生成的。调用
Context.SaveChanges()
创建它,然后读取ID。

您可以采用以下方法:

public class Song
{
    public int Id { get; set; }

    public string ArtistName { get; set; }

    public virtual IList<Similarity> SimilaritiesWhereOriginal { get; set; }

    public virtual IList<Similarity> SimilaritiesWhereSimilar { get; set; } 
}

public class Similarity
{
    public int Id { get; set; }

    public int OriginalId { get; set; }
    public virtual Song Original { get; set; }

    public int SimilarId { get; set; }
    public virtual Song Similar { get; set; }
}

public class ApplicationDbContext : DbContext
{
    public DbSet<Song> Songs { get; set; }

    public DbSet<Similarity> Similarities { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Song>().HasMany(x => x.SimilaritiesWhereOriginal).WithRequired(x => x.Original).WillCascadeOnDelete(false);
        modelBuilder.Entity<Song>().HasMany(x => x.SimilaritiesWhereSimilar).WithRequired(x => x.Similar).WillCascadeOnDelete(false);
        base.OnModelCreating(modelBuilder);
    }
}
公共类歌曲
{
公共int Id{get;set;}
公共字符串ArtistName{get;set;}
公共虚拟IList相似性,其中原始{get;set;}
公共虚拟IList相似性wheresimilar{get;set;}
}
公共类相似性
{
公共int Id{get;set;}
public int OriginalId{get;set;}
公共虚拟歌曲原创{get;set;}
公共int-SimilarId{get;set;}
公共虚拟歌曲{get;set;}
}
公共类ApplicationDbContext:DbContext
{
公共DbSet歌曲{get;set;}
公共数据库集相似性{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasMany(x=>x.SimilaritiesWhereOriginal).WithRequired(x=>x.Original.WillCascadeOnDelete(false);
modelBuilder.Entity().HasMany(x=>x.similaritieswheresimilable).WithRequired(x=>x.similaries).WillCascadeOnDelete(false);
基于模型创建(modelBuilder);
}
}

相似类显示“原始”歌曲和“相似”歌曲之间的关系。该类将EF自动生成的表替换为您自己的多2多关系表,您可以从代码中访问该表。

如果该类上没有属性,如何读取Id?这是一个编译时错误。我的手机使你的部分问题难以理解。EF6使访问联接表属性变得困难。通常在获取对象ID之前获取对象。谢谢您的回答。我一直在尝试使用您的答案向
SimilarVersion
表中添加一行,但它没有按预期工作。我已经编辑了我的原始问题以显示问题。我也不明白为什么我们需要
相似性
表中的
公共虚拟歌曲原件
公共虚拟歌曲相似性
。我想也许我实施的不正确。
var songToUpload = new Song
{
    AudioName = uploadSongDtos[i].AudioName.Trim(),
    ArtistName = uploadSongDtos[i].ArtistName,                        
};

 foreach (var compareAgainstString in _songService.GetSongs().ToDictionary(x => x.Id, x => x.AudioName))
 {
       var score = SearchContext.Levenshtein.iLD(songToUpload.AudioName, compareAgainstString.Value);

       //Don't add the current song
       if (score < 50 && songToUpload.Id != compareAgainstString.Key)
           songToUpload.SimilarVersionsWhereSimilar.Add(new SimilarVersion { SimilarId = compareAgainstString.Key });
 }
public class Song
{
    public int Id { get; set; }

    public string ArtistName { get; set; }

    public virtual IList<Similarity> SimilaritiesWhereOriginal { get; set; }

    public virtual IList<Similarity> SimilaritiesWhereSimilar { get; set; } 
}

public class Similarity
{
    public int Id { get; set; }

    public int OriginalId { get; set; }
    public virtual Song Original { get; set; }

    public int SimilarId { get; set; }
    public virtual Song Similar { get; set; }
}

public class ApplicationDbContext : DbContext
{
    public DbSet<Song> Songs { get; set; }

    public DbSet<Similarity> Similarities { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Song>().HasMany(x => x.SimilaritiesWhereOriginal).WithRequired(x => x.Original).WillCascadeOnDelete(false);
        modelBuilder.Entity<Song>().HasMany(x => x.SimilaritiesWhereSimilar).WithRequired(x => x.Similar).WillCascadeOnDelete(false);
        base.OnModelCreating(modelBuilder);
    }
}