EF 4.1一对多关系

本文关键字:关系 一对多 EF | 更新日期: 2023-09-27 18:00:08

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

我的错误消息:

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

EF 4.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。

您可以尝试替换这一行:

public int siteId { get; set; }

有了这个:

public Site site { get; set; }

有两种方法可以用类名或id来描述关系。您将两者结合在一起,这就是为什么关系已经存在的原因。