Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架CodeFirst:不带集合的外键_Entity Framework_Ef Code First_Foreign Key Relationship - Fatal编程技术网

Entity framework 实体框架CodeFirst:不带集合的外键

Entity framework 实体框架CodeFirst:不带集合的外键,entity-framework,ef-code-first,foreign-key-relationship,Entity Framework,Ef Code First,Foreign Key Relationship,我从EF6.1 CodeFirst和现有的batabase开始。我有以下表格: Company ID integer Code varchar Currency_ID integer Currency ID integer Company_ID integer Code varchar 背后的概念是,每个表都包含对公司ID的引用。 我创建了以下类: class Company { public int ID { get; set; } public strin

我从EF6.1 CodeFirst和现有的batabase开始。我有以下表格:

Company
  ID integer
  Code varchar
  Currency_ID integer

Currency
  ID integer
  Company_ID integer
  Code varchar
背后的概念是,每个表都包含对公司ID的引用。 我创建了以下类:

class Company
{
  public int ID { get; set; }
  public string Code { get; set; }
  [ForeignKey("Currency")
  public int? Currency_ID { get; set; }

  public virtual Currency Currency { get; set; }
}

class Currency
{
  public int ID { get; set; }
  public string Code { get; set; }
  [ForeignKey("Company")
  public int? Company_ID { get; set; }

  public virtual Company Company { get; set; }
}
当我使用这个模型时,我得到了错误

公司\货币\目标::多重性在角色中无效 关系“公司货币”中的“公司货币目标”。因为 从属角色属性不是键属性,而是上 依赖角色的多重性的界限必须为“*”

除了向Company类添加ICollection CurrencyList之外,还有其他解决方案吗

--更新--

以下是一些示例数据:

公司编号:1代码:XXX当前编号:100 公司编号:2代码:YYY货币编号:102 货币识别号:100代码:欧元公司识别号:1 货币ID:101代码:DOL公司\u ID:1 货币识别号:102代码:欧元公司识别号:2

--更新2--

我使用fluent api找到了一个可能的解决方案

modelBuilder.Entity<Company>().HasOptional(q => q.Currency).WithMany().HasForeignKey(q => q.Currency_Id);
modelBuilder.Entity<Currency>().HasRequired(q => q.Company).WithMany().HasForeignKey(q => q.Company_Id);

有没有办法使用attirbutes实现同样的功能?

您可以使用fluent api进行设置。首先,需要从实体类中删除Currency\u ID和Company\u ID属性。在DbContext类中重写OnModelCreating方法,并在其中放置代码:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>()
            .HasOptional(f => f.Currency)
            .WithOptionalDependent()
            .Map(c => c.MapKey("Currency_ID"));

        modelBuilder.Entity<Currency>()
            .HasOptional(f => f.Company)
            .WithOptionalDependent()
            .Map(c => c.MapKey("Company_ID"));

        base.OnModelCreating(modelBuilder);
    }
但要考虑到这不是一种关系,而是两种关系。所以,若公司指的是货币,那个么货币可能指的是其他公司。如果只希望有1个关系,则应去掉“公司”或“货币”中的一个外键列,并按如下方式进行配置:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>()
            .HasOptional(f => f.Currency)
            .WithOptionalDependent(f => f.Company)
            .Map(c => c.MapKey("Currency_ID"));

        base.OnModelCreating(modelBuilder);
    }

你的模型错了。只有一家公司可以使用一种货币吗?如果是这样,每家公司如何开展业务?我认为,您还将ForeignKey属性放在了错误的属性上。这应该是关联,而不是外键。PS当一家公司能够像跨国公司一样使用多种货币时会发生什么?模型应该是可以的。正如我所说,每个表都有一个到company表的链接。这样,数据库中的每个记录都与公司关联。每个公司都创建自己的货币记录,并将一种货币与公司关联。这是该公司使用的主要货币。根据我的发现,您可以在ID属性上放置ForeignKey:多个公司可以使用相同的货币吗?一家公司能否拥有多种货币,其中一种货币是主要货币?