EntityFramework - 带有FK的复合密钥表到另一个复合密钥表

时间:2015-02-10 16:42:22

标签: entity-framework asp.net-mvc-5 entity-framework-6 foreign-key-relationship composite-primary-key

两个表都带有复合主键两者与另一个表格中的一个主键具有外键

问题在于,当我创建迁移时,它会弄乱外键。

我必须使用数据注释。

示例:

public class City
{
    [Key, Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string CityCode { get; set; } 

    [Key, Column(Order = 2)]
    public string CompanyCode { get; set; }

    public string Description { get; set; }     

    [ForeignKey("CompanyCode")]
    public virtual Company Company { get; set; }
}

public class PostCode
{
    [Key, Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string Code { get; set; } 

    [Key, Column(Order = 1)]
    public string CompanyCode { get; set; }

    public string Description { get; set; } 

    public string CityCode { get; set; }      

    [ForeignKey("CompanyCode")]
    public virtual Company Company { get; set; }

    [ForeignKey("CityCode, CompanyCode")]
    public virtual City City { get; set; }
}
  • PostCode City 有一个复合主键(代码, CompanyCode )。
  • PostCode 具有表 City CityCode CompanyCode )的外键。

问题是 CompanyCode 主键的一部分,同时也是复合外键 City 的一部分

当我说它弄乱了外键我的意思是:

CONSTRAINT [FK_dbo.PostCodes_dbo.Companies_CompanyCode] FOREIGN KEY ([CompanyCode]) REFERENCES [dbo].[Companies] ([CompanyCode]) ON DELETE CASCADE,
CONSTRAINT [FK_dbo.PostCodes_dbo.Cities_CompanyCode_CityCode] FOREIGN KEY ([CompanyCode], [CityCode]) REFERENCES [dbo].[Cities] ([CityCode], [CompanyCode])

在第二个约束中,它使用 CityCode 引用 CompanyCode ,使用 CompanyCode 引用 CityCode

我无法在互联网上找到任何这样的例子。

我哪里错了?

提前致谢。

修改1

City Company 之间有一个简单的主键 CompanyCode PostCodes Company

相同

2 个答案:

答案 0 :(得分:1)

如果您希望在CityCompany之间创建一对一的关系,我担心您的模型无法实现。在配置一对一关系时,实体框架要求从属端的主键也是外键,否则EF不会将其视为一对一关系。在你的情况下,dependend结束es City,但你有一个问题,你想要添加另一个PK,即CityCode,它打破了一对一的关系,因为,例如,以下记录可能发生:

Company             City 
Id            CityCode CompanyId
1               ee33a      1
2               aa23b      1

这就是说,如果你想实现你的方案,我想你必须在CompanyCity之间建立一对多的关系。使用数据注释可以这样:

public class City
{
    [Key, Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string CityCode { get; set; }

    [Key, ForeignKey("Company"),Column(Order = 2)]
    public string CompanyCode { get; set; }

    public string Description { get; set; }

    public virtual Company Company { get; set; }
}

public class Company
{
    public string Id { get; set; }
    public virtual ICollection<City> Cities { get; set; }
}

如果您不想引用与Cities相关的城市,则可以省略Company中的Company导航属性。

同样适用于PostCode实体。

更新

要在PostCode实体中实现您想要的效果,您必须以这种方式映射FK:

public class PostCode
{
    [Key, Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string Code { get; set; }

    [Key,ForeignKey("City"), Column(Order = 2)]
    public string CityCompanyCode { get; set; }

    public string Description { get; set; }

    [ForeignKey("City"), Column(Order = 1)]
    public string CityCode { get; set; }


    public virtual City City { get; set; }

    [ForeignKey("Company")]
    public string CompanyCode { get; set; }
    public virtual Company Company { get; set; }
}

Here是一个很好的例子,说明如何处理复合FK

答案 1 :(得分:0)

我总是在我的表中添加一个主键,例如:CityId int,PostCode int。有了这个我解决关系。

public class PostCode
{   
[Key, Column(Order = 0)]
public string PostCodeId  { get; set; } 

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string Code { get; set; } 

public string CompanyCode { get; set; }

public string Description { get; set; } 

public string CityCode { get; set; }      

[ForeignKey("CompanyCode")]
public virtual Company Company { get; set; }

[ForeignKey("CityCode, CompanyCode")]
public virtual City City { get; set; }
}

感谢