Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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
C# 实体框架:糟糕的数据库设计和多个键_C#_Entity Framework - Fatal编程技术网

C# 实体框架:糟糕的数据库设计和多个键

C# 实体框架:糟糕的数据库设计和多个键,c#,entity-framework,C#,Entity Framework,我正在使用实体框架用C#开发我们软件的新版本。我对这项技术还不熟悉,但新版本进展顺利。我们的主要障碍是如何设计与现有(设计糟糕的)数据库模式相匹配的实体。设计一个新的数据库模式超出了这个项目的范围,尽管我们可以在必要时进行一些小的更改 我目前正试图回避一个已经出现的特殊问题。以下是一些模型来说明问题: public class EntityA { [Key] public int SurrogateKey { get; set; } public int Natura

我正在使用实体框架用C#开发我们软件的新版本。我对这项技术还不熟悉,但新版本进展顺利。我们的主要障碍是如何设计与现有(设计糟糕的)数据库模式相匹配的实体。设计一个新的数据库模式超出了这个项目的范围,尽管我们可以在必要时进行一些小的更改

我目前正试图回避一个已经出现的特殊问题。以下是一些模型来说明问题:

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类的演练