none
EntityFrame 中如何映射给不同的用户不同的数据表? RRS feed

  • 问题

  • 我的需求是这样的:

    MVC架构网站,有一个数据库,其中一部分数据是所有用户存储在一起的,但是有一部分数据的数据量很大,我想根据登陆进来不同的用户存储到不同的表内。比如:ResultDaily_1000 , ResultDaily_2000 这样。

    现在通过FluentAPI 在OnModelCreating中做了映射。代码如下:

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
    
                //重映射            
                modelBuilder.Entity<ResultDaily>().ToTable("ResultDaily_" + UserID.ToString());
    
                base.OnModelCreating(modelBuilder);
            }

    在只有一个用户登陆下,工作的很正常,数据的写入和读取都是正确的数据表中,但是网站有2个以上用户登陆进来时,所有的数据都会被写入同一张表中(或者 ResultDaily_1000 ,或者 ResultDaily_2000)。

    我知道通过SQL的BulkCopy可以解决这个问题,但是我想知道能否再EnitityFramework的范围内解决这个问题呢?


    • 已编辑 campsun 2014年11月20日 9:06
    • 已移动 Caillen 2014年11月21日 1:38
    2014年11月20日 9:04

答案

  •     public class BackTestContent : DbContext
        {
    ......
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
    ......
            }
       }
    
    

    就是普通的CodeFirst的代码,OnModelCreating 也不是在 static class中。

    UserId是存在ClaimsPrincipal中,归属于用户线程。

    var userIDClaim = ClaimsPrincipal.Current.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);

    Userid的读取并无任何问题,是正确的。根据不同的用户登陆总是能找到对应的用户名。

    但是因为OnModelCreating只运行一次,所以Model对应的数据表只在第一次建立好之后就不会变更了。

    2014年11月25日 7:56

全部回复

  • 請查看清楚你怎存UserID? Static variable? 還有這OnModelCreating是在Static Class中?

    請貼上有關的code


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆標示為解答以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to clickMark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2014年11月21日 3:10
  •     public class BackTestContent : DbContext
        {
    ......
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
    ......
            }
       }
    
    

    就是普通的CodeFirst的代码,OnModelCreating 也不是在 static class中。

    UserId是存在ClaimsPrincipal中,归属于用户线程。

    var userIDClaim = ClaimsPrincipal.Current.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);

    Userid的读取并无任何问题,是正确的。根据不同的用户登陆总是能找到对应的用户名。

    但是因为OnModelCreating只运行一次,所以Model对应的数据表只在第一次建立好之后就不会变更了。

    2014年11月25日 7:56
  • Hello,

    >>但是因为OnModelCreating只运行一次,所以Model对应的数据表只在第一次建立好之后就不会变更了。

    正如你所说,这个Model只会在第一次运行application的时候跑一次,所以你想要的动态映射在EF范围内目前是不支持的。可以考虑用存储过程来实现你的逻辑。

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年11月28日 9:15
    版主