Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >存储库模式和UOW模式C#的更新实体

存储库模式和UOW模式C#的更新实体
EN

Software Engineering用户
提问于 2019-06-05 06:10:42
回答 1查看 2.4K关注 0票数 -1

在一个模拟解决方案中,我创建了3个模拟项目来实现分层架构设计,主要是表示层(Web) -域模型层-基础结构层。我还没有添加应用程序服务层(Web )。

为了简单起见,我只有两个域模型实体: Customer.cs和Category.cs。在域模型层中,我还放置了存储库接口(包括自定义的和通用的)。

在基础设施层,我有dbcontext、Work (包括它的接口)和存储库类(它们实现了存储库接口)。

下面是我的通用存储库接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IRepositoryGeneric<TEntity> where TEntity : class
{
    // CRD
    void Add(TEntity entity);
    void Remove(TEntity entity);
    TEntity Get(object Id);
    IEnumerable<TEntity> GetAll();

    void Save();
}

泛型仓库类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class RepositoryGeneric<T> : IRepositoryGeneric<T> where T : class
{
    protected readonly AppDbContext db;
    public RepositoryGeneric(AppDbContext db)
    {
        this.db = db;
    }

    public void Add(T entity)
    {
        db.Set<T>().Add(entity);
    }

    public T Get(object Id)
    {
        return db.Set<T>().Find(Id);
    }

    public IEnumerable<T> GetAll()
    {
        return db.Set<T>().ToList();
    }

    public void Remove(T entity)
    {
        db.Set<T>().Remove(entity);

    }

    public void Save()
    {
        db.SaveChanges();
    }
}

工作单元接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IUnitOfWork : IDisposable
{
    IRepositoryCustomer Customers { get; }
    IRepositoryCategory Categories { get; }

    int Save();
}

工级单位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UnitOfWork : IUnitOfWork
{
    private readonly AppDbContext db;
    public UnitOfWork()
    {
        db = new AppDbContext();
    }

    private IRepositoryCustomer _Customers;
    public IRepositoryCustomer Customers
    {
        get
        {
            if (this._Customers == null)
            {
                this._Customers = new RepositoryCustomer(db);
            }
            return this._Customers;
        }
    }

    private IRepositoryCategory _Categories;
    public IRepositoryCategory Categories
    {
        get
        {
            if (_Categories == null)
            {
                _Categories = new RepositoryCategory(db);
            }
            return _Categories;
        }
    }

    public void Dispose()
    {
        db.Dispose();
    }

    public int Save()
    {
        return db.SaveChanges();
    }
}

我了解到,在我的通用存储库接口中不应该有更新方法。但是如果没有更新方法,我现在只能在我的演示MVC web控制器中使用编辑方法。下面,我只提取了编辑操作方法。错误出现在那一行粗体中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "CategoryID,CategoryName,Description")] Category category)
    {
        if (ModelState.IsValid)
        {
            **db.Entry(category).State = EntityState.Modified;**
            db.Save();
            return RedirectToAction("Index");
        }
        return View(category);
    }

最后,我的类是否在正确的层中创建?例如,IUnitOfWork.cs应该在基础设施层吗?

我的整个解决方案源代码都可以在我的github - https://github.com/ngaisteve1/LayeredArchitectureDesignCSharp上找到。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2019-06-05 14:28:05

通用存储接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IRepositoryGeneric<TEntity> where TEntity : class
{
    // CRD
    void Add(TEntity entity);
    void Remove(TEntity entity);
    TEntity Get(object Id);
    IEnumerable<TEntity> GetAll();

    void UpdateState(TEntity entity);
    void Save();
}

存储库泛型类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class RepositoryGeneric<T> : IRepositoryGeneric<T> where T : class
{
    protected readonly AppDbContext db;
    public RepositoryGeneric(AppDbContext db)
    {
        this.db = db;
    }

    public void Add(T entity)
    {
        db.Set<T>().Add(entity);
    }

    public T Get(object Id)
    {
        return db.Set<T>().Find(Id);
    }

    public IEnumerable<T> GetAll()
    {
        return db.Set<T>().ToList();
    }

    public void Remove(T entity)
    {
        db.Set<T>().Remove(entity);

    }

    public void UpdateState(T entity)
    {
        db.Entry(entity).State = EntityState.Modified;
    }

    public void Save()
    {
        db.SaveChanges();
    }
}

Web控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "CategoryID,CategoryName,Description")] Category category)
    {
        if (ModelState.IsValid)
        {
            db.Categories.UpdateState(category);
            db.Commit();
            return RedirectToAction("Index");
        }
        return View(category);
    }
票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/392920

复制
相关文章
ElementUI的DatePicker(日期选择器)限定范围的玩法
1.ElementUI的DatePicker(日期选择器)时间范围只能在一个月 效果 222 代码 <template> <div class="page"> <el-date-pic
治电小白菜
2020/08/25
5.1K0
ElementUI的DatePicker(日期选择器)限定范围的玩法
WPF 日期选择器和时间选择器
格式有要求,必须是yyyy-MM-dd hh:mm:ss或者yyyy/MM/dd hh:mm:ss
码客说
2023/02/10
6.1K0
日期选择器DatePicker和时间选择器TimePicker
在实际开发中,经常会遇见一些时间选择器、日期选择器、数字选择器等需求,那么从本期开始来学习Android中常用选择器,今天学习的是DatePicker和TimePicker。 一、DatePicker DatePicker是一个比较简单的组件,从FrameLayout派生而来,供用户选择日期。其在FrameLayout的基础上提供了一些方法来获取当前用户所选择的日期,如果程序需要获取用户选择的日期则可通过为DatePicker添加 OnDateChangedListener 进行监听来实现。
分享达人秀
2018/02/05
5.2K0
日期选择器DatePicker和时间选择器TimePicker
Datepicker日期选择器插件
这个插件还是比较简单的,而且样式也比较漂亮,可以自定义选择年月日、年月日时分、年月、时间段选择等等。
从入门到进错门
2018/08/21
3.9K0
Datepicker日期选择器插件
css3选择器-选择范围 原
(adsbygoogle = window.adsbygoogle || []).push({});
tianyawhl
2019/04/04
6650
UIDatePicker 日期时间选择器
//星期 月日 时分 上下午 UIDatePicker dk = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 20, 320, 200)]; [self.view addSubview:dk]; //四种 类型 dk.datePickerMode = UIDatePickerModeCountDownTimer; / UIDatePickerModeTime, // Displays hour, m
用户8983410
2021/10/29
2.7K0
uni-app日期选择器
首先是这个picker选择器,mode选择日期,end是写一个范围前日期,:end就是这个日期是动态变化的,还有change函数
叶茂林
2023/08/13
1.5K0
uni-app日期选择器
Android 日期选择器之DatePickerDialog
DatePickerDialog其实就是把CalendarView封装进Dialog中了,调用起来更方便快捷。
yechaoa
2022/06/10
2.2K0
Android 日期选择器之DatePickerDialog
简单清爽的 PowerBI 单日期选择器
上述案例反应了用户选择了一个日期,然后所有的数据计算以该日期为基准,只显示最近 X 天的,X 由滑竿切片器给定。
BI佐罗
2019/12/10
4.8K0
简单清爽的 PowerBI 单日期选择器
Flutter中的日期、格式化日期、日期选择器组件在
所谓时间戳,是指自格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
拉维
2019/08/29
26.1K0
Flutter中的日期、格式化日期、日期选择器组件在
JavaScript 日期选择器 Pikaday 的高级用法
我前面介绍了轻量级的 JavaScript 日期选择器 Pikaday 和其简单的用法,但是在使用当中发现有几个限制:
Denis
2023/04/15
1.3K0
好多Javascript日期选择器呀-4
<Script LANGUAGE="JavaScript">  var months = new Array("一", "二", "三","四", "五", "六", "七", "八", "九","十", "十一", "十二");  var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31);  var days = new Array("日","一", "二", "三","四", "五", "六");  var classTemp;  var today=new getToday();  var year=today.year;  var month=today.month;  var newCal; 
Java架构师必看
2021/03/22
8370
好多Javascript日期选择器呀-6
<script language=javascript> var DS_x,DS_y;
Java架构师必看
2021/03/22
1K0
好多Javascript日期选择器呀–2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"> <html xmlns="<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>"> <head> <title>calender select</title> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <style type='text/css'> body {      font-family:"Lucida sans unicode", sans-serif;      font-size:12px;      margin:0;      padding:0;      height:100%;      } #basis {      display:inline;      position:relative;      } #calender {      position:absolute;      top:30px;      left:0;      width:220px;      background-color:#fff;      border:3px solid #ccc;      padding:10px;      z-index:10;      } #control {      text-align:center;      margin:0 0 5px 0;      } #control select {      font-family:"Lucida sans unicode", sans-serif;      font-size:11px;      margin:0 5px;      vertical-align:middle;      } #calender .controlPlus {      padding:0 5px;      text-decoration:none;      color:#333;      } #calender table {      empty-cells: show;      width:100%;      font-size:11px;      table-layout:fixed;      } #calender .weekdays td{      text-align:right;      padding:1px 5px 1px 1px;      color:#333;      } #calender .week td {      text-align:right;      cursor:pointer;      border:1px solid #fff;      padding:1px 4px 1px 0;      } #calender .week .today {       background-color:#ccf;      border-color:#ccf;      } #calender .week .holiday {      font-weight: bold;      } #calender .week .hoverEle {      border-color:#666;      background-color:#99f;      color:#000;      }
Java架构师必看
2021/03/22
6620
AngularDart Material Design 日期选择器 顶
当用户键入日期时,将专门处理具有2位数年份的日期。 例如。7/7/77被解释为1977年7月7日,而不是77年7月7日。这个逻辑看起来是未来20年:现在(2015年8月),“35”被解释为2035,但“36”被解释为“1936”。 明年,“36”将开始被解释为2036年。
南郭先生
2018/09/30
5.1K0
【开源 UI 组件】Flutter 图表范围选择器
这样当图表的数据量过大,不宜全部展示时,可选择的局部展示就是个不错的解决方案。由于一般的图表库没有提供该功能,这里自己通过绘制来实现以下,操作效果如下所示:
张风捷特烈
2022/09/20
1.3K1
【开源 UI 组件】Flutter 图表范围选择器
好多Javascript日期选择器呀-5
<TITLE>最精致的日历式日期输入控件 (Smart Ver 1.00)</TITLE>
Java架构师必看
2021/03/22
1.1K0
好多Javascript日期选择器呀–3
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- saved from url=(0045)<a href="http://e.goldia.cn/plus/calendar/calendar.htm" target="_blank">http://e.goldia.cn/plus/calendar/calendar.htm</a> --> <HTML><HEAD> <META http-equiv=Content-Type content="text/html; charset=gb2312"> <SCRIPT type=text/javascript> String.prototype.Format = function(){ var tmpStr = this; var iLen = arguments.length; for(var i=0;i<iLen;i++){ tmpStr = tmpStr.replace(new RegExp("//{" + i + "//}", "g"), arguments[i]); } return tmpStr; } Calendar = { //region Property today :new Date(), year:2005, month:8, date:21, curPosX:0, curPosY:0, curCapture:null, curDay:null, //endregion
Java架构师必看
2021/03/22
7530
DateTimePicker 日期时间选择器,默认获取当前日期
在vue里面,我们已经用到过单独的TimePicker 时间选择器和DatePicker 日期选择器了,现在需要用到一个可以同时选择年月日时分秒的插件,饿了么的文档里面就有现成可以使用的~~
王小婷
2021/07/19
7.3K0
DateTimePicker 日期时间选择器,默认获取当前日期
点击加载更多

相似问题

我如何知道文件的区域设置?

16

我怎么知道这里需要哪个文件?

22

我想知道文件创建日期

10

我需要知道在过程中保留业务层的缺点

59

我需要知道用于Textmate和SVN的行尾设置

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文