Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 工作单位+;存储库模式-添加自定义存储库_C#_Entity Framework_Design Patterns_Unit Of Work - Fatal编程技术网

C# 工作单位+;存储库模式-添加自定义存储库

C# 工作单位+;存储库模式-添加自定义存储库,c#,entity-framework,design-patterns,unit-of-work,C#,Entity Framework,Design Patterns,Unit Of Work,我以下是: 实体 [Table("Authors")] public class Author { [Key] public int ID { get; set; } public string Name { get; set; } public virtual ICollection<Book> Books { get; set; } } [Table("Books")] public class Book { [Key] publi

我以下是:

实体

[Table("Authors")]
public class Author {
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Book> Books { get; set; }
}
[Table("Books")]
public class Book {
    [Key]
    public int ID { get; set; }
    public string Title { get; set; }
    public int Author_ID { get; set; } 

    [ForeignKey("Author_ID")] 
    public virtual Author Author { get; set; }
}
public class MyDbContext : DbContext
{
    public virtual DbSet<Author> Authors { get; set; }
    public virtual DbSet<Book> Books { get; set; }
    public MyDbContext(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
    }
}
我想在DB中插入Book对象之前自动填充Code属性。 我想我需要创建一个“自定义”BookRepository,它继承GenericRepository,并覆盖Add函数,以实现类似的功能:

public void Add(Book entity)
    {
        entity.Code = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds+entity.Title.Replace(" ","");
        _dbSet.Add(entity);
    }

我不熟悉设计模式/继承/接口概念。可以这样做吗?

您试图添加的逻辑属于模型而不是存储库,存储库与此无关。存储库负责访问数据库并对其运行查询

我写了一篇文章,介绍了如何使用EF规划精简存储库和工作单元

我将在下面插入链接


希望这能有所帮助

我有个问题想问你,你认为你尝试遵循的模式背后有什么好处?当我可以做
context.SomeTable.Add
时,我看到了所有这些类,我严重怀疑是什么让人们试图(但未能)通过UoW/存储库隐藏EF。请注意,您正在将EF依赖项泄漏给客户端,因此“能够更改EF”在这里甚至不适用。我将处理使用Uow/存储库模式的项目。。不是我自己选的。我正在训练如何使用它。我认为你应该在尝试类似的东西之前熟悉这些概念,因为你正在使用它们。也就是说,没有什么能阻止你以你想要的方式进行图书回购。@Camiloterevento我完全同意你的观点,但这是写所有这些博客和(简化的天真)“示例”的人的问题。无论需要对实体进行什么样的特殊处理,都可以在名为“服务”的类中进行。存储库不知道业务逻辑(这是关于业务逻辑的),服务不知道业务逻辑。但所有这些都是基于意见的。
public interface IUnitOfWork
{
    IRepository<Author> AuthorRepository { get; }
    IRepository<Book> BookRepository { get; }

    /// <summary>
    /// Commits all changes
    /// </summary>
    void Commit();
    /// <summary>
    /// Discards all changes that has not been commited
    /// </summary>
    void RejectChanges();
    void Dispose();
}
public class UnitOfWork : IUnitOfWork
{
    private readonly MyDbContext _dbContext;
    #region Repositories
    public IRepository<Author> AuthorRepository => 
       new GenericRepository<Author>(_dbContext);
    public IRepository<Book> BookRepository => 
       new GenericRepository<Book>(_dbContext);
    #endregion
    public UnitOfWork(MyDbContext dbContext)
    {
        _dbContext = dbContext;
    }
    public void Commit()
    {
        _dbContext.SaveChanges();
    }
    public void Dispose()
    {
        _dbContext.Dispose();
    }
    public void RejectChanges()
    {
        foreach (var entry in _dbContext.ChangeTracker.Entries()
              .Where(e => e.State != EntityState.Unchanged))
        {
            switch (entry.State)
            {
                case EntityState.Added:
                    entry.State = EntityState.Detached;
                    break;
                case EntityState.Modified:
                case EntityState.Deleted:
                    entry.Reload();
                    break;
            }
        }
    }
}
[Table("Books")]
public class Book {
    [Key]
    public int ID { get; set; }
    public string Title { get; set; }
    public int Author_ID { get; set; } 
    public string Code { get; set; } //I'm adding a Code property here

    [ForeignKey("Author_ID")] 
    public virtual Author Author { get; set; }
}
public void Add(Book entity)
    {
        entity.Code = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds+entity.Title.Replace(" ","");
        _dbSet.Add(entity);
    }