2014-07-01 133 views
0

我的问题看起来很简单。我需要实现数据库中项目之间的关系。例如:诸如计算机和软件之类的实体之间的关系向用户显示计算机存储特定软件并且类似地 - 在特定计算机中安装软件。我想我应该实现一个具有源代码ID和目标ID或类似的实体。我在EntityFramework 6中首先使用代码编写了一些代码。这里有两个类:实体框架中的实体之间的双重关系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”。名称值应该是有效的导航属性名称。

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

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

+0

您使用的是迁移吗? – Tacoman667

+0

是的,几分钟前我找到了解决方案。我在ConfigurationItem中编写了两个导航属性,代码运行成功,但我不知道它是否以我希望它工作的方式完成 – matB

回答

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

如果我只有2个实体,但ConfigurationItem实体由计算机,软件,位置等。我只想将ConfigurationItem实体相互关联。 – matB

+0

我认为它仍然有可能,只是援助和投标是同一个实体 – Zakos

0

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

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

这两个表进行设置,形态项目和关系他们的主键字段。当你删除一个时,该配置会告诉SQL Server删除这些关系,并且该关系对父项可能有cascadeDelete: true。这将导致您遇到的循环级联删除问题。

迁移生成后,请将其中一个或全部更改为cascadeDelete: false,这将解决该问题。如果我记得,这是EF默认生成的。