none
ado.net entity 4.0 有复合主键的多表联合 RRS feed

  • 问题

  • 应用ado.net entity 4.0 技术在进行多表联合时,一个表(User)里有一个主键ID,另一个表(Book)里有两个主键ID,BookName,将这两个表联合(通过ID关联)映射到一个实体类(entity) UserBook, 表映射完后(所有属性都有了映射,而且UserBook.ID同时映射到Usert和Book的两个ID),出现报错.

    表User: ID(主)   NAME

    表Book: ID(主)   BookName(主)   NUM

    实体UserBook : ID(主)  NAME  BookName(主)   NUM

    UserBook映射: 到表User: ID->ID  NAME->NAME

                          到表Book: ID->ID  BookName->BookName  NUM->NUM

    错误信息:

    错误 1 错误 3024: 映射从第 145 行开始的片段时有问题:必须为 EntitySet UserBook 的所有键属性(UserBook.ID, UserBook.BookName)指定映射。

    请求帮助!!!!谢谢


    • 已编辑 py_study 2012年4月11日 9:21
    2012年4月11日 9:14

答案

  • 您好,若想做两个表联合,直接用join语句就可以了,关于同时更新,建议您使用TransactionScope.这样如果您更新时候出现什么错误就不会产生垃圾数据了。希望这些对您有帮助。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 py_study 2012年4月19日 8:12
    2012年4月17日 2:38
    版主
  • 您好,因为你是两张表映射到一个实体,这就要求两个表必须是严格的一对一关系,即两表主键相同。如果你想实现这种映射,User表ID为主键,Book表只能有一个主键ID,同时这个键也必须是外键。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 py_study 2012年4月19日 8:12
    2012年4月12日 2:04
    版主

全部回复

  • 没有人帮助一下吗?

    2012年4月12日 0:49
  • 您好,因为你是两张表映射到一个实体,这就要求两个表必须是严格的一对一关系,即两表主键相同。如果你想实现这种映射,User表ID为主键,Book表只能有一个主键ID,同时这个键也必须是外键。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 py_study 2012年4月19日 8:12
    2012年4月12日 2:04
    版主
  • 您好,因为你是两张表映射到一个实体,这就要求两个表必须是严格的一对一关系,即两表主键相同。如果你想实现这种映射,User表ID为主键,Book表只能有一个主键ID,同时这个键也必须是外键。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    谢谢你的解答,让我明白了一些!

    如果我就想实现这两个表的联合显示怎么办?

    我主要是想完成以下功能:

    1. 通过数据库中两个表的主键(ID)关联成一个表显示

    2. FORM界面更新时同时更新库中的两个表数据

    3. 插入新数据时,会在两个表中同时插入键相同的记录

    4. 删除时,会同时在两个表中删除键相同的记录

    两张表映射到一个实体是能做到这一点的!

    ado.net entity 4 有什么其它好的方法能实现吗?



    • 已编辑 py_study 2012年4月12日 6:27
    2012年4月12日 6:24
  • 您好,

    1. 当您将数据库中两个表映射到一个实体时,在EF中他就体现为一个有两张表的字段连接后的实体,绑定的时候绑定该实体的集合即为绑定了这两张表。

    2. 同样的,因为在EF中已经为一个实体,当你对该实体进行更新时,数据库会自动更新相应的两张表。

    3. 和上一条一样,当你做插入时,实力化这个实体,初始化字段,插入后,数据库中的两张表都会有插入信息。

    4. 删除时也同时会删除两张表的。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月13日 2:19
    版主
  • 谢谢你的回答!

    但是关键我的问题还是没能解决,

    因为数据库里的表是客户表,结构我是不能更改的,两个表是一对多的关系,我想通过界面绑定这两个表的联合,并同时更新,怎么做到?最好能说说具体的实现方法,不盛谢谢!

    2012年4月16日 4:29
  • 您好,若想做两个表联合,直接用join语句就可以了,关于同时更新,建议您使用TransactionScope.这样如果您更新时候出现什么错误就不会产生垃圾数据了。希望这些对您有帮助。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 py_study 2012年4月19日 8:12
    2012年4月17日 2:38
    版主
  • 但是join出来的数据绑定到gridform后不让修改,就是界面改不了数据!

    2012年4月19日 5:13
  • 您好,请问gridform是什么?

    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月19日 5:56
    版主
  • 显示控件是DevExpress.XtraGrid.GridControl

    如:gridControl1.DataSource = context.users; 一切正常,users为映射到库里一张表的实体

    但JOIN就不行了,

                var query = from user in users
                            join book in books
                            on user.ID
                            equals book.ID
                            select new
                            {
                                user.ID,
                                user.NAME,
                                book.BookName,
                                book.NUM
                            };

                gridControl1.DataSource = query ;  //users,books分别为映射到库里一张表的实体

    显示正常,数据也正是我想要的,但界面不能修改,


    • 已编辑 py_study 2012年4月19日 7:42
    2012年4月19日 7:41
  • 您好,我不太熟悉这个控件,这个我建议您到DevExpress论坛去问一下有没有什么解决方案。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月19日 7:54
    版主