开发者

EF 4.1 One to Many relationship

I have what I consider a very simple data model and I'm struggling badly with EF 4.1 CF.

My data model has two classes:

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; }
}

My configuration files are like this:

public class SiteConfiguration : EntityTypeConfiguration<Site> {

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

In my controller for MVC I simply want to remove a building from a site. Here is my controller code:

public ActionResult Delete(int id, int siteId) {
  var site = repo.GetById(siteId);
  var building = site.bui开发者_开发问答ldings.SingleOrDefault(c => c.id == id);
  ou.buildings.Remove(site);
  repo.Save(); 
}

My Error Message:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted. Any thoughts or suggestions would be greatly appreciated.


Try this:

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);
    }
}

This tells the site that it can have many buildings, and tells the building that it REQUIRES a site, and doesn't make sites worry about building requirements or vice versa.

As I understand it, you only pull in HasMany.WithMany/WithRequired in many-many relationships and the like.


You could try and replace this line:

public int siteId { get; set; }

With this:

public Site site { get; set; }

There are two ways to describe a relationship with the class names or with the id. You combined both that is why you got the relationship already exists.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜