2011-06-22 185 views
4

我有我认为是一个非常简单的数据模型,并且我正在与EF 4.1 CF一起苦苦挣扎。EF 4.1一对多关系

我的数据模型有两类:

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

我的错误消息:

操作失败:关系 不能被改变,因为一个或 多个外键的属性是 非空的。当更改为 的关系时,相关的 外键属性设置为空值 值。如果外键没有 支持空值,则必须定义新的 关系,必须将 外键属性指定为 另一个非空值,或必须删除不相关对象 。任何 的想法或建议将是 非常感谢。

+0

您可以扩展您的代码示例以包含'repo'和'ou'的定义吗? – therealmitchconnors

回答

0

你可以尝试和替换这一行:

public int siteId { get; set; } 

有了这个:

public Site site { get; set; } 

有描述与类名或ID的关系的两种方式。你们结合起来,这就是为什么你们的关系已经存在。

+0

通过做这一切,我现在得到了一个不同的错误。 “Site_Buildings”AssociationSet中的关系处于“已删除”状态。考虑到多重性约束,相应的“Site_Buildings_Target”也必须处于“已删除”状态。 –

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中引入许多关系等。

+0

为什么建筑必须了解该网站?我真的不希望这种关系存在,因为我永远不需要从建筑物导航到网站,它始终是网站建设。\ –

+0

有趣的 - 我想它不会 - 但是那么你会只有“HasMany”在没有HasRequired的站点配置中(试图将建筑物连接到站点)。 –