Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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# EF4.1(代码优先)-如何指定复合关系_C#_Entity Framework_Entity Framework 4.1_Entity Relationship - Fatal编程技术网

C# EF4.1(代码优先)-如何指定复合关系

C# EF4.1(代码优先)-如何指定复合关系,c#,entity-framework,entity-framework-4.1,entity-relationship,C#,Entity Framework,Entity Framework 4.1,Entity Relationship,在Linq to SQL中,我可以指定一个关系,该关系不必依赖于数据库中现有的外键和PK,这对于创建这样的复合关系非常有用: public class Equipment_CableNormalised { ... [Association(ThisKey = "EquipmentId,PortNumber", OtherKey = "EquipmentId,PortNumber", IsForeignKey = false)] public List<Equip

在Linq to SQL中,我可以指定一个关系,该关系不必依赖于数据库中现有的外键和PK,这对于创建这样的复合关系非常有用:

public class Equipment_CableNormalised
{
    ...

    [Association(ThisKey = "EquipmentId,PortNumber", OtherKey = "EquipmentId,PortNumber", IsForeignKey = false)]
    public List<EquipmentPort> EquipmentPorts
    {
        get; set;
    }

}
公共级设备\u电缆标准化
{
...
[关联(ThisKey=“设备ID,端口号”,OtherKey=“设备ID,端口号”,IsForeignKey=false)]
公共列表设备端口
{
获得;设置;
}
}
然后生成类似于“
”的sql。在EP.EquipmentId=blah和EP.PortNumber=blah”
上连接EquipmentPorts EP


我可以在EF4.1中做同样的事情吗(使用注释或fluent api)?我知道您可以指定复合键并使用[keys]和[ForeignKeys]属性,但此关系不映射到键…

代码中的示例关系是如何工作的?我希望EquipmentID必须是PK或唯一密钥(L2S和EF都不支持),因为否则关系不可能存在(一对一和一对多要求唯一主体)。一旦在一侧PK,端口号是冗余的

代码优先只允许映射到键。如果您有现有数据库,您可以在模型中对其进行欺骗,并以映射现有数据库的相同方式映射新关系,但您仍然必须遵循简单的规则-主体中的属性是主键,从属实体中的属性映射为外键

如果您希望EF为您生成DB,您将始终拥有数据库中的所有关系。

使用HasKey

或者使用HasKey,在modelcreating上使用它

 modelBuilder.Entity<SalesOnEachCountry>().HasKey(x => new { x.CountryId, x.OrYear });   
关于您关于外键的问题,我还没有尝试纯代码(OnModelCreating)方法,也许您可以在子类本身上放置两个ForeignKey属性,可能还需要设置列顺序

这可能就是答案


这个答案证实了我的直觉,即您可以在子类本身上放置两个ForeignKey属性。

您所说的“关系不映射到键”是什么意思?如果它没有映射到键(PK/UK,FK),则它不是数据库关系。它不是数据库关系。碰巧,其中一个实体实际上映射到视图,而不是表。在L2S中,将这些实体与关联定义连接在一起是一个方便的解决方案,它使我不必编写更复杂的查询代码。因此,它不是数据库中内容的“纯”表示谢谢,我还没有对此感到高兴,我将尝试一个更简单的测试,看看效果如何。谢谢您的回复。在这种情况下,我永远不想从EF生成DB,因为它非常复杂,其中存储了进程和一些EF不支持的数据类型。在L2S中,您可以按照我的示例创建关系(关联),这些关系实际上并不映射到数据库中存在的关系。该示例的一侧是一个视图(因此没有键),另一侧是一个具有自己的“id”PK的表。我将其视为L2S,它允许我定义特殊关系,就像您可以“连接”SQL中实际上没有定义关系的两个表一样。
public class SalesOnEachCountry
{        
    [Key, Column(Order=0)] public int CountryId { get; set; }
    public string CountryName { get; set; }
    [Key, Column(Order=1)] public int OrYear { get; set; }
     
    public long SalesCount { get; set; }      
    public decimal TotalSales { get; set; }
}