我两个表都带有复合主键。 两者与另一个表格中的一个主键具有外键。
问题在于,当我创建迁移时,它会弄乱外键。
我必须使用数据注释。
示例:
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; }
}
问题是 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 。
相同答案 0 :(得分:1)
如果您希望在City
和Company
之间创建一对一的关系,我担心您的模型无法实现。在配置一对一关系时,实体框架要求从属端的主键也是外键,否则EF不会将其视为一对一关系。在你的情况下,dependend结束es City
,但你有一个问题,你想要添加另一个PK,即CityCode
,它打破了一对一的关系,因为,例如,以下记录可能发生:
Company City
Id CityCode CompanyId
1 ee33a 1
2 aa23b 1
这就是说,如果你想实现你的方案,我想你必须在Company
和City
之间建立一对多的关系。使用数据注释可以这样:
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; }
}
感谢