EF4 POCO映射一对多复合键 [英] EF4 POCO Mapping One-To-Many composite key

查看:97
本文介绍了EF4 POCO映射一对多复合键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个POCO类的现有数据库,我正在使用流畅的api方法和modelbuilder成功地使用CTP4进行映射,但是我在映射两个实体之间的一对多关系时遇到了问题(如下)ProposalScenario "有很多"
ProposalScenarioDetail。 我认为这个问题是ProposalScenario具有复合主键(见下文)。

I have an existing database with POCO classes that I'm mapping using CTP4 successfully using the fluent api approach with modelbuilder but I'm having problems mapping a one-to-many relationship between two entities (below) ProposalScenario "has many" ProposalScenarioDetail.  The issue I think here is that ProposalScenario has composite primary key (see below).

我无法弄清楚如何相应地映射它以避免SQL异常:{"无效对象名称'dbo.ProposalScenario_ProposalScenarioDetails'。"。 我试图为连接指定一个约束,但它仅限于键的一部分。 
这个映射似乎应该可以工作 - 我希望我在某个地方遗漏了某些东西。 解决方法是不"包括"查询中的导航但我无法查询详细信息实体,因为它有一个返回父
表的引用,并且没有"存储忽略"属性尚可。

I am not able to figure out how to map this accordingly to avoid the SQL Exception : {"Invalid object name 'dbo.ProposalScenario_ProposalScenarioDetails'.".  I tried to specify a constraint for the join but its only on part of the key.  This mapping seems like it should work - I'm hoping I am missing something somewhere.  The work around is to not "include" the navigation in the query but then I cannot query the details entity either because it has a reference back to the parent table and there is no "store ignore" attribute yet available.

谢谢你看这个! 

// WORKS

var
good = db.ProposalScenarios.Take(5)。ToList();

Thanks you for looking at this! 
// WORKS
var
good = db.ProposalScenarios.Take(5).ToList();

// FAILS

var
bad = db.ProposalScenarios.Include(“ ProposalScenarioDetails”)。Take(5)。ToList();

      
[PROPSL_ID] [int] NOT
NULL,

      [PROPSL_ID] [int] NOT NULL,

     
...

      ...

}

创建
TABLE [dbo] [PROPOSAL_SCENARIO]

CREATE TABLE [dbo]. [PROPOSAL_SCENARIO](

     
[PROPSL_ID] [int]
NULL,

      [PROPSL_ID] [int] NOT NULL,

     
[SCENARIO_ID] [int]
NULL,

      [SCENARIO_ID] [int] NOT NULL,

8
NOT NULL,

      [LAST_OPER_ID] [char]( 8) NOT NULL,

NOT
NULL

      [LAST_TMSTMP] [datetime] NOT NULL

}

创建
TABLE [dbo] [PROPOSAL_SCENARIO_DETAIL]

CREATE TABLE [dbo]. [PROPOSAL_SCENARIO_DETAIL](

     
[PROPSL_ID] [int]
NULL,

      [PROPSL_ID] [int] NOT NULL,

     
[SCENARIO_DTL_ID] [int]
NULL,

      [SCENARIO_DTL_ID] [int] NOT NULL,

8
NOT NULL,

      [LAST_OPER_ID] [char]( 8) NOT NULL,

NOT
NULL

      [LAST_TMSTMP] [datetime] NOT NULL

}

//配置

   
public partial
class
ProposalScenarioConfiguration
EntityConfiguration
< ProposalScenario >

    public partial class ProposalScenarioConfiguration : EntityConfiguration <ProposalScenario >

   
{

       
public ProposalScenarioConfiguration()

        public ProposalScenarioConfiguration()

       
{

        {

           
// PK

            // PK

           
HasKey(e => e.ProposalId) ;

            HasKey(e => e.ProposalId);

           
HasKey(e => e.ScenarioId) ;

            HasKey(e => e.ScenarioId);

 

           
HasRequired(e => e.Proposal)

            HasRequired(e => e.Proposal)

               
.WithMany (e => e.ProposalScenarios)

                .WithMany(e => e.ProposalScenarios)

               
.HasConstraint ((a,b)=> a.ProposalId == b.ProposalId);

                .HasConstraint((a, b) => a.ProposalId == b.ProposalId);

 

           
HasRequired(e => e.Scenario)

            HasRequired(e => e.Scenario)

               
.HasConstraint ((a,b)=> a.ScenarioId == b.ScenarioId);

                .HasConstraint((a, b) => a.ScenarioId == b.ScenarioId);

 

           
//我无法指定提案ID的部分约束 - 获取必须指定提案方案的所有主键的错误

           
//有或没有这一行,我得到无效的对象dbo.ProposalScenario_ProposalScenarioDetails - 但你会认​​为

           
//因为每个实体都有一个配置,导航属性就知道如何映射正确的表格映射

           
//在ProposalScenarioDetailsConfiguration上指定为DBO.PROPOSAL_SCENARIO_DETAIL

//            
HasMany(e => e.ProposalScenarioDetails) .WithRequired(e => e.ProposalScenario);

//            HasMany(e => e.ProposalScenarioDetails).WithRequired(e => e.ProposalScenario);

 

           
MapSingleType(e => new

            MapSingleType(e => new

            
{

            {

               
PROPSL_ID = e.ProposalId,

                PROPSL_ID = e.ProposalId,

   ;             
SCENARIO_ID = e.ScenarioId,

                SCENARIO_ID = e.ScenarioId,

          ;        LAST_OPER_ID = e.LastOperatorId,

                 LAST_OPER_ID = e.LastOperatorId,

               
LAST_TMSTMP = e.Timestamp

                LAST_TMSTMP = e.Timestamp

           
})。ToTable(" dbo.PROPOSAL_SCENARIO" );

            }).ToTable("dbo.PROPOSAL_SCENARIO" );

 

       
}

        }

  

   
}

 

 

  public
partial class
ProposalScenarioDetailConfiguration
EntityConfiguration < ProposalScenarioDetail >

  public partial class ProposalScenarioDetailConfiguration : EntityConfiguration <ProposalScenarioDetail >

   
{

       
public ProposalScenarioDetailConfiguration()

        public ProposalScenarioDetailConfiguration()

       
{

        {

           
HasKey(e => e.ProposalId) ;

            HasKey(e => e.ProposalId);

           
HasKey(e => e.ScenarioDetailId) ;

            HasKey(e => e.ScenarioDetailId);

 

           
HasRequired(e => e.ScenarioDetail)

            HasRequired(e => e.ScenarioDetail)

               
.HasConstraint ((a,b)=> a.ScenarioDetailId == b.ScenarioDetailId);

                .HasConstraint((a, b) => a.ScenarioDetailId == b.ScenarioDetailId);

 

           
//我无法指定提案ID的部分约束 - 获取必须指定提案方案的所有主键的错误

           
//无论是否有这一行,我都会得到无效的目标dbo.ProposalScenario_ProposalScenarioDetails - 但你会认​​为

           
//因为每个实体都有一个配置,导航属性就知道如何映射正确的表格映射

           
//在ProposalScenarioDetailsConfiguration上指定为DBO.PROPOSAL_SCENARIO_DETAIL

//            
HasRequired(e => e.ProposalScenario)

//            HasRequired(e => e.ProposalScenario)

//                
.WithMany (e => e.ProposalScenarioDetails);

//                .WithMany(e => e.ProposalScenarioDetails);

 

           
MapSingleType(e => new

            MapSingleType(e => new

            
{

            {

               
PROPSL_ID = e.ProposalId,

                PROPSL_ID = e.ProposalId,

        
SCENARIO_DTL_ID = e.ScenarioDetailId,

         SCENARIO_DTL_ID = e.ScenarioDetailId,

                
LAST_OPER_ID = e.LastOperatorId,

                LAST_OPER_ID = e.LastOperatorId,

<跨度>&NBSP;&NBSP;
              LAST_TMSTMP = e.Timestamp

                 LAST_TMSTMP = e.Timestamp

          ;&NBSP;&NBSP;
})。ToTable(" dbo.PROPOSAL_SCENARIO_DETAIL" );

            }).ToTable("dbo.PROPOSAL_SCENARIO_DETAIL" );

         
}

         }

    &NBSP;&NBSP;
}

     }

 

推荐答案

嗨Marty,

Hi Marty,

查看您的架构,看起来PROPOSAL_SCENARIO_DETAIL不包含FK映射到PROPOSAL_SCENARIO的两个PK属性的属性(即PROPOSAL_SCENARIO_DETAIL中没有SCENARIO_ID列)。

Looking at your schema it looks like PROPOSAL_SCENARIO_DETAIL doesn't contain FK properties that map to both of the PK properties of PROPOSAL_SCENARIO (i.e. there is no SCENARIO_ID column in PROPOSAL_SCENARIO_DETAIL).

您是否在数据库中的这两个表之间配置了FK约束?如果你这样做,我认为PROPOSAL_SCENARIO.PROPSL_ID上必须有唯一的索引? EF一般不支持唯一约束,所以你的FK需要映射到一个完整的
PK,一种可能的方法是告诉Code First PROPOSAL_SCENARIO.PROPSL_ID实际上是该实体的PK(鉴于它有无论如何都是唯一的。)

Do you have a FK constraint configured between these two tables in the database? If you do then I assume there must be a unique index on PROPOSAL_SCENARIO.PROPSL_ID? EF in general does not support unique constraints yet so your FKs need to map to a complete PK, one possible way around this would be to tell Code First that PROPOSAL_SCENARIO.PROPSL_ID is actually the PK of that entity (given it has to be unique anyway).

如果我对数据库的设置做了一些不正确的假设,请告诉我,我会尝试为你找到另一种方法。

If I've made some incorrect assumptions about the setup of your database then let me know and I'll try and find another way around this for you.

〜罗文

 


这篇关于EF4 POCO映射一对多复合键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆