EF 4.1一对多关系

时间:2011-06-22 18:02:26

标签: c# entity-framework code-first

我认为这是一个非常简单的数据模型,而且我在使用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(); 
}

我的错误讯息:

  

操作失败:关系   无法更改,因为一个或   更多的外键属性是   非空的。当进行更改时   关系,相关   foreign-key属性设置为null   值。如果外键没有   支持null值,一个新的   关系必须定义,   必须分配外键属性   另一个非空值,或者   必须删除不相关的对象。任何   会有什么想法或建议   非常感谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

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。

答案 1 :(得分:0)

您可以尝试替换此行:

public int siteId { get; set; }

有了这个:

public Site site { get; set; }

有两种方法可以描述与类名或id的关系。你把两者结合起来就是这个原因。