简体   繁体   中英

Can't create many-to-many relationship

I have two entites with a many-to-many relationship. Company and SearchKeyword .

Here are the models:

class SearchKeyword
{
    public int ID { get; set; }
    public string Text { get; set; }

    public virtual ICollection<Company> Companies { get; set; }
}

class Company
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual OtherDetail OtherDetails { get; set; }
    public virtual ICollection<SearchKeyword> SearchKeywords { get; set; }
}

I am trying to add a SearchKeyword to a company but it won't let me. I tried this:

using (var db = new PlaceDBContext())
{
    Company c = db.Companies.Single(x => x.ID == 1);
    SearchKeyword sk = db.SearchKeywords.Single(x => x.ID == 1);
    c.SearchKeywords.Add(sk);
    db.SaveChanges();
}

It says Object reference not set to an instance of an object. I am not sure what is null. In inspector I can see c and sk both have full values. I guess I must be missing a fundamental of how the many-to-many relationship works with EF.

What am I doing wrong?

This is because SearchKeywords is null.

Either you can assign a List to it before adding a new instance

using (var db = new PlaceDBContext())
{
    Company c = db.Companies.Single(x => x.ID == 1);
    SearchKeyword sk = db.SearchKeywords.Single(x => x.ID == 1);
    c.SearchKeywords = new List<SearchKeyword>();
    c.SearchKeywords.Add(sk);
    db.SaveChanges();
}

Or you can do it constructor method

class Company
{
    public Company()
    {
        SearchKeywords = new List<SearchKeyword>();
    }

    public int ID { get; set; }
    public string Name { get; set; }

    public virtual OtherDetail OtherDetails { get; set; }
    public virtual ICollection<SearchKeyword> SearchKeywords { get; set; }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM