EF 4.1 Отношение один ко многим - PullRequest
4 голосов
/ 22 июня 2011

У меня есть очень простая модель данных, и я плохо борюсь с EF 4.1 CF.

Моя модель данных имеет два класса:

public class Site {
  public int id { get; set; }
  public string name { get; set; }

  public ICollection<Building> buildings { get; set; }
}

public class Building {
  public int id { get; set; }
  public int siteId { get; set; }
  public string name { get; set; }
}

Мои файлы конфигурации выглядят так:

public class SiteConfiguration : EntityTypeConfiguration<Site> {

public SiteConfiguration() {
  HasMany(c => c.buildings)
    .WithRequired()
    .HasForeignKey(c => c.siteId);
  }
}

В моем контроллере для MVC я просто хочу удалить здание с сайта. Вот мой код контроллера:

public ActionResult Delete(int id, int siteId) {
  var site = repo.GetById(siteId);
  var building = site.buildings.SingleOrDefault(c => c.id == id);
  ou.buildings.Remove(site);
  repo.Save(); 
}

Мое сообщение об ошибке:

Операция не удалась: связь не может быть изменено, потому что один или больше свойств внешнего ключа ненулевой. Когда изменение сделано в отношения, связанные свойство внешнего ключа установлено в нуль значение. Если внешний ключ не поддержка нулевых значений, новый отношения должны быть определены, свойство внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален. любой мысли или предложения будут с благодарностью.

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Попробуйте это:

public class Building 
{
    public int id { get; set; }
    public Site Site { get; set; }
    ...
}

public class SiteConfiguration : EntityTypeConfiguration<Site> 
{
    public SiteConfiguration() 
    {
        HasMany(c => c.buildings);
    }
}

public BuildingConfiguration : EntityTypeConfiguration<Building> 
{
    public BuildingConfiguration()
    {
        HasRequired(s=>s.Site);
    }
}

Это говорит сайту о том, что на нем может быть много зданий, и сообщает зданию, что оно ТРЕБУЕТ сайта, и не заставляет сайты беспокоиться о требованиях к зданию или наоборот.

Насколько я понимаю, вы включаете только HasMany.WithMany / WithRequired во многих-многих отношениях и т.п.

0 голосов
/ 22 июня 2011

Вы можете попробовать заменить эту строку:

public int siteId { get; set; }

С этим:

public Site site { get; set; }

Есть два способа описать отношения с именами классов или с идентификатором. Вы объединили оба, поэтому у вас уже есть отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...