EntityFramework 6中实体之间的双重关系

时间:2014-07-01 18:01:31

标签: c# asp.net-mvc entity-framework code-first

我的问题看起来很简单。我需要在数据库中的项之间实现关系。例如:计算机和软件等实体之间的关系向用户显示计算机存储特定软件,类似地 - 在特定计算机中安装软件。我想我应该实现一个具有源id和目标id或类似东西的实体。我在EntityFramework 6中首先使用代码编写了一些代码。这里有两个类:

public class ConfigurationItem
{
    public int Id { get; set; }
    public String Name { get; set; }
    public String DeploymentState { get; set; }
    public String IncidentState { get; set; }
    [DataType(DataType.MultilineText)]
    public String Description { get; set; }
    [DataType(DataType.MultilineText)]
    public String Note { get; set; }

    public virtual ICollection<Relationship> Relationship { get; set; }
}

public class Relationship
{   
    [Key]
    public int RelationshipId { get; set; }
    [ForeignKey("ConfigurationItem")]
    public int SourceId { get; set; }
    [ForeignKey("ConfigurationItem")]
    public int TargetId { get; set; }
    public String Type { get; set; }

    public virtual ConfigurationItem Source { get; set; }
    public virtual ConfigurationItem Target { get; set; }

}

此解决方案无效。我需要一个提示或什么我应该尝试使其正常工作。 EF抛出有关外键的错误:

  

类型为“cms_1.Models.Relationship”的属性“SourceId”上的ForeignKeyAttribute无效。在依赖类型“cms_1.Models.Relationship”上找不到导航属性“ConfigurationItem”。 Name值应该是有效的导航属性名称。

当我尝试解决它时,EF会抛出有关级联删除的错误。我知道如何禁用它,但我只是不想。我需要一个适合该功能的解决方案,但我想我不知道如何做一个代表给定场景的模型。

简单 - 我需要在实体“B”中存储来自实体“A”的两个外键。怎么可能?

2 个答案:

答案 0 :(得分:0)

从快速回顾中,我可以说你需要3张桌子:
第一:电脑
第二:软件
第三:一个表,让我们称之为ComputerSoftware,它告诉哪个软件在哪台计算机上(或者你也可以看到它 - 哪台计算机使用什么软件),它有ComputerID列和SoftwareID列。

示例(source)

class Country
{
    public int Id { get; set; }
    public virtual ICollection<CountryCurrency> CountryCurrencies { get; set; }
}

class Currency
{
    public int Id { get; set; }
}

class CountryCurrency
{
    [Key, Column(Order=0)]
    public virtual int CountryId { get; set; }
    [Key, Column(Order=1)]
    public virtual int CurrencyId { get; set; }

    public virtual Country Country { get; set; }
    public virtual Currency Currency { get; set; }
}

答案 1 :(得分:0)

您的问题可能是在创建这些表的迁移文件中,它会有类似

的内容
.ForeignKey("dbo.Relationship", t => t.Id, cascadeDelete: true)

这将在两个表,ConfigurationItem和其主键字段的关系上设置。删除时,该配置会告诉SQL Server删除关系,并且该关系可能与父级有cascadeDelete: true。这将导致您遇到的循环级联删除问题。

生成迁移后,请进入并将其中一个或全部更改为cascadeDelete: false,这样可以解决该问题。如果我记得的话,这就是EF默认生成的内容。