【问题标题】:double relationship between entities in EntityFramework 6EntityFramework 6中实体之间的双重关系
【发布时间】:2014-07-01 18:01:30
【问题描述】:

我的问题看起来很简单。我需要实现数据库中项目之间的关系。例如:计算机和软件等实体之间的关系向用户表明计算机存储特定软件,类似地 - 软件安装在特定计算机中。我想我应该用源 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 会引发有关级联删除的错误。我知道如何禁用它,但我只是不想。我需要具有该功能的适当解决方案,但我认为我不知道如何制作代表给定场景的模型。

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

【问题讨论】:

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

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


【解决方案1】:

通过快速回顾,我可以看出您需要 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; }
}

【讨论】:

  • 如果我只有 2 个实体,但 ConfigurationItem 实体由计算机、软件、位置等扩展,我会没问题。我只想将 ConfigurationItem 实体相互关联。
  • 我觉得还是有可能的,只是Aid和Bid是同一个实体
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 2020-12-07
    • 2012-07-23
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多