VB.net 2010 视频教程 VB.net 2010 视频教程 VB.net 2010 视频教程
当前位置:
首页 > 编程开发 > c#教程 >
  • C#教程之我们一起写框架】领域驱动设计的CodeF(3)

  • 2019-03-21 20:07 来源:未知

代码很简单,下面我们一起来解读下DateBaseContext文件里的代码。

首先是DateBaseContext继承了DbContext类;DbContext可以理解为微软提供的,专门来管理数据库和代码之间的关系的类。

然后再构造函数DateBaseContext()里,可以看到,我们在构造函数中做了几项基础配置,代码中已经做了相应的注释。

其中this.Configuration.ProxyCreationEnabled属性,我们重点讲一下。

当ProxyCreationEnabled属性设置为True时,我们一旦运行系统,系统会自动的,数据模型同步到数据库,并且会创建一个__MigrationHistory表,来记录同步的内容。

PS:【虽然,在领域驱动设计的理念中,是先有表的数据模型,然后在建立表结构。但,这只是理念,我们运用的时候,先建立表在建立数据模型也是可以的。我这里只是为了简单的实现,所以将ProxyCreationEnabled设置为了True】

接下来,我们定义了一个public virtual DbSet<Kiba_User> Kiba_User { get; set; }属性。

Kiba_User 这个属性,我们可以把他理解为,数据库表在代码世界的代理,如果我们想对数据库表内容进行查询和修改,只要对这个代理进行修改,就会自动同步到数据库了。

然后我们重写了OnModelCreating方法,在OnModelCreating里,把我们刚刚建立的映射关系添加了进去,这样数据库的表,就被我们立体的加载到了代码世界。

TableRepository

TableRepository中主要是应用DateBaseContext来对表进行增删改查的处理,理论上TableRepository是修改数据库的唯一入口;

我们首先,先看下BaseRepository类;代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class BaseRepository
{
    public DateBaseContext Database
    {
        get
        {
            var context = RepositoryStatic.DateBaseContext as DateBaseContext;
 
            if (context == null)
            {
                context = new DateBaseContext();
                RepositoryStatic.DateBaseContext = context;
            }
             
            return context;
        }
    }
    public int SaveChanges()
    {
        int i = 0;
        int saveCount = 0;
        bool saveFailed;
        do
        {
            saveFailed = false;
 
            try
            {
                saveCount++;
                i = Database.SaveChanges();
                Logger.Debug("SaveChanges Retrun:" + i);
 
            }
            catch (DbUpdateConcurrencyException ex)
            {
                if (saveCount > 3)
                {
                    throw new Exception("服务器繁忙,请稍后");
                }
                Logger.Error("DbUpdateConcurrencyException保存次数:" + saveCount, ex);
                saveFailed = true;
                try
                {
                    ex.Entries.Single().Reload();
                }
                catch (Exception exReload)
                {
                    Logger.Info("exReload保存失败");
                    throw exReload;
                }
            }
            catch (DbUpdateException ex)
            {
                if (ex.Message.Contains("与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"))
                {
                    throw new Exception("服务器繁忙,请稍后");
                }
                else
                {
                    throw ex;
                }
            }
            catch (DbEntityValidationException dbEx)
            {
                Logger.Error(dbEx);
                throw dbEx;
            }
 
            catch (Exception ex)
            {
                Logger.Info("SaveChanges保存失败");
                throw ex;
            }
 
        while (saveFailed);
        return i;
    }
}
相关教程