C# 实体框架:糟糕的数据库设计和多个键
我正在使用实体框架用C#开发我们软件的新版本。我对这项技术还不熟悉,但新版本进展顺利。我们的主要障碍是如何设计与现有(设计糟糕的)数据库模式相匹配的实体。设计一个新的数据库模式超出了这个项目的范围,尽管我们可以在必要时进行一些小的更改 我目前正试图回避一个已经出现的特殊问题。以下是一些模型来说明问题:C# 实体框架:糟糕的数据库设计和多个键,c#,entity-framework,C#,Entity Framework,我正在使用实体框架用C#开发我们软件的新版本。我对这项技术还不熟悉,但新版本进展顺利。我们的主要障碍是如何设计与现有(设计糟糕的)数据库模式相匹配的实体。设计一个新的数据库模式超出了这个项目的范围,尽管我们可以在必要时进行一些小的更改 我目前正试图回避一个已经出现的特殊问题。以下是一些模型来说明问题: public class EntityA { [Key] public int SurrogateKey { get; set; } public int Natura
public class EntityA
{
[Key]
public int SurrogateKey { get; set; }
public int NaturalKey1 { get; set; }
public int NaturalKey2 { get; set; }
public virtual ICollection<EntityB> B { get; set; }
public virtual ICollection<EntityC> C { get; set; }
}
public class EntityB
{
[Key]
public int EntityBID{ get; set; }
[ForeignKey("EntityA "), Column(Order = 0)]
public int EntityANaturalKey1 { get; set; }
[ForeignKey("EntityA "), Column(Order = 1)]
public int EntityANaturalKey2 { get; set; }
public virtual EntityA A { get; set; }
}
public class EntityC
{
[Key]
public int EntityCID{ get; set; }
[ForeignKey("EntityA ")]
public int EntityASurrogateKey { get; set; }
public virtual EntityA A { get; set; }
}
公共类实体a
{
[关键]
公共int代理基{get;set;}
public int NaturalKey1{get;set;}
public int NaturalKey2{get;set;}
公共虚拟ICollection B{get;set;}
公共虚拟ICollection C{get;set;}
}
公共类实体B
{
[关键]
public int EntityBID{get;set;}
[ForeignKey(“EntityA”),第列(顺序=0)]
public int EntityANaturalKey1{get;set;}
[ForeignKey(“EntityA”),第列(顺序=1)]
public int EntityANaturalKey2{get;set;}
公共虚拟实体A{get;set;}
}
公共类实体
{
[关键]
public int EntityCID{get;set;}
[外键(“实体”)]
public int entityAsErrorGateKey{get;set;}
公共虚拟实体A{get;set;}
}
所以在我们的数据库中,我们有20个实体跟随EntityB,它们引用EntityA的自然键,还有类似数量的实体,比如EntityC,它们引用代理键
据我所知,实体框架不允许为同一实体定义多个键。当我尝试在我的应用程序中处理这些模型时,我会发现关于多重性以及依赖角色和主要角色的数量不相同的错误
是否有通过实体框架解决此问题的变通方法,或者我必须调整我的数据库,以便所有实体都使用代理密钥?不是100%确定,但我相信您需要进行一些修改。尝试类似的线程如果您有机会创建对代理键的引用,请不要三思。最大的优点是它们是不变的。自然键可以(而且经常)更改,因为它们具有业务意义。我想您应该先使用EDMX模型来更改数据库?如果使用Fluent API,则可以设置复合键。下面是如何将DB反向工程为fluent API类的演练