多对多关系 - 自动初始化

时间:2015-10-27 09:49:25

标签: entity-framework asp.net-mvc-5

问题涉及缺少2个表的链接关系条目。

我创建了两个类:

文件:

public class File
{
public int FileId {get; set;}
public string Name{get; set;{
public ICollection<int> TagId {get; set;}
public virtual ICollection<Tag> Tag {get; set;}
}

标签:

public class Tag
{
public int TagId {get; set;}
public string Name {get; set;}
public ICollection<int> FileId {get; set;}
public ICollection<File> File {get; set;}
}

创建表格:

public DbSet<File> Files { get; set; }
public DbSet<Tag> Tags{ get; set; }

在数据库中自动创建了另一个表TagFiles,其中表之间存在关系。

我添加了StartInitializer类,每次重新启动我都会启动数据库。在init方法中,我添加了新记录:

...
var tags = new List<Tag>
{
new Tag() { TagId = 1, Name = "A"},
new Tag() { TagId = 2, Name = "B"},
new Tag() { TagId = 3, Name = "C"},
new Tag() { TagId = 4, Name = "D"},
new Tag() { TagId = 5, Name = "E"},
new Tag() { TagId = 6, Name = "F"},
new Tag() { TagId = 7, Name = "G"}
};
tags.ForEach(g => context.Tags.Add(g));
context.SaveChanges();

var files = new List<File>
{
new File() { FileId = 1,  Name = "1", TagId = new List<int>{1, 3, 2, 4}}
};
files.ForEach(g => context.Files.Add(g));
context.SaveChanges();
...

不幸的是,FileETag表条目不是自动添加的,尽管在我看来应该确保TagId = new List <int> {1, 3, 2, 4}。这里缺少什么东西?

1 个答案:

答案 0 :(得分:1)

我认为你的问题在于你不需要的ID收集。

当您首先使用EF代码以获得多对多关系表时,您必须明确提及它。另外,它将被视为2对多关系。

这是我建议的更改:

public class File
{
    public int FileId {get; set;}
    public string Name{get; set;}
    [InverseProperty("Files")]
    public virtual ICollection<Tag> Tags {get; set;}
}

public class Tag
{
   public int TagId {get; set;}
   public string Name {get; set;}
   public ICollection<File> Files {get; set;}
}

注意创建该连接的[InverseProperty("Files")]