我正在使用asp.net mvc 5和C#with Entity Framework ...我有函数的模型和域类...现在我需要使用存储过程....我正在努力运动.
我遵循代码第一个现有的数据库,我有存储过程写在那里.我的问题是如何在我的Web应用程序中调用该存储过程.
存储过程:
ALTER PROCEDURE [dbo].[GetFunctionByID](
@FunctionId INT
)
AS
BEGIN
SELECT *
FROM Functions As Fun
WHERE Function_ID = @FunctionId
END
Run Code Online (Sandbox Code Playgroud)
域类:
public class Functions
{
public Functions()
{
}
public int Function_ID { get; set; }
public string Title { get; set; }
public int Hierarchy_level { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
功能模型:
[Table("Functions")]
public class App_Functions
{
public App_Functions()
{
}
[Key]
public int Function_ID { get; set; }
[StringLength(50)]
[Required]
public string …Run Code Online (Sandbox Code Playgroud) asp.net-mvc stored-procedures entity-framework repository-pattern
我正在使用Entity Framework 6学习ASP.NET MVC 5应用程序中的存储库和工作单元模式.
我已经阅读了很多教程和文章,但几乎所有教程和文章都是相同的.其他人说,存储库和工作单元模式是好的,其他人说DbContext已经是一个存储库和工作单元,其他人说类似的东西,但提供了一种完全不同的方法.我尝试了所有这些不同的方法(好吧,也许不是全部)并且仍然在努力确定哪种方法是最正确的方法.
我现在拥有的是:
不确定我是否需要粘贴它的代码,我认为这是非常通用的,问题实际上不是Repository/UnitOfWork.我遇到的问题是将ASP.NET Identity类与我的存储库和工作单元结合使用.我正在为成员资格和所有其他数据共享相同的数据库 - 我认为这是一种常见的情况.我找不到好的解决方案如何使用我的存储库实例化ASP.NET Identity类.
UserStore<ApplicationUser> store = new UserStore<ApplicationUser>(_DBCONTEXT_);
this.UserManager = new UserManager<ApplicationUser>(store);
Run Code Online (Sandbox Code Playgroud)
我应该用什么代替DBCONTEXT,以便它与我的UnitOfWork共享相同的DbContext?或者如何以其他方式完成使ASP.NET身份与UnitOfWork一起工作?
我尝试将DbContext暴露为UnitOfWork类的公共属性,如:
UserStore<ApplicationUser> store = new UserStore<ApplicationUser>(this.unitOfWork.MyDbContext);
Run Code Online (Sandbox Code Playgroud)
但是我不认为它是正确的 - 它不适用于自定义IDbContext接口,并使代码不适合单元测试.
我也试图实现CustomUserStore和CustomRoleStore - 通常它可以工作,但是当我测试它时,它需要实现越来越多的方法.这个解决方案看起来太复杂了 - 我真的希望应该有更简单的方法.
c# entity-framework unit-of-work repository-pattern asp.net-identity
我有存储库(例如ContactRepository,UserRepository等),它封装了对域模型的数据访问.
当我在寻找数据时,例如
生日是1960年以后的联系人
(等等),
我开始实现诸如FirstNameStartsWith(字符串前缀)和YoungerThanBirthYear(int year)之类的存储库方法,基本上遵循了许多示例.
然后我遇到了一个问题 - 如果我必须结合多个搜索怎么办?我的每个存储库搜索方法(如上所述)仅返回一组有限的实际域对象.为了寻找更好的方法,我开始在IQueryable <T>上编写扩展方法,例如:
public static IQueryable<Contact> FirstNameStartsWith(
this IQueryable<Contact> contacts, String prefix)
{
return contacts.Where(
contact => contact.FirstName.StartsWith(prefix));
}
Run Code Online (Sandbox Code Playgroud)
现在我可以做一些事情
ContactRepository.GetAll().FirstNameStartsWith("tex").YoungerThanBirthYear(1960);
Run Code Online (Sandbox Code Playgroud)
然而,我发现自己正在编写扩展方法(并且发明了疯狂的类,例如全面的ContactsQueryableExtensions,并且通过在适当的存储库中包含所有内容而失去了"良好的分组".
这真的是这样做的方式,还是有更好的方法来实现同样的目标?
我已经实现了一个通用存储库,并想知道是否有一种智能方法可以在出现死锁异常的情况下实现重试逻辑?
所有存储库方法的方法都应该相同.那么无论如何我可以避免在每一种方法中使用retry-count再次编写'try/catch - call方法'吗?
任何建议都是受欢迎的.
我的存储库代码:
public class GenericRepository : IRepository
{
private ObjectContext _context;
public List<TEntity> ExecuteStoreQuery<TEntity>(string commandText, params object[] parameters) where TEntity : class
{
List<TEntity> myList = new List<TEntity>();
var groupData = _context.ExecuteStoreQuery<TEntity>(commandText, parameters);
return myList;
}
public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
var entityName = GetEntityName<TEntity>();
return _context.CreateQuery<TEntity>(entityName);
}
public IEnumerable<TEntity> GetAll<TEntity>() where TEntity : class
{
return GetQuery<TEntity>().AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
1.Solution:
从 chris.house.00的解决方案略微修改
public static T DeadlockRetryHelper<T>(Func<T> repositoryMethod, int maxRetries) …Run Code Online (Sandbox Code Playgroud) c# entity-framework try-catch repository-pattern database-deadlocks
EF的新手,我注意到使用存储库模式可以真正简化事情并允许我做一些嘲弄.太好了.
我的问题
objectContext的典型用法是尽快销毁,见下文
using (var context = new SchoolEntities())
{
context.AddToDepartments(department);
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
使用Repository模式我注意到没有人真正使用"使用模式",例如
using (var repository= new Repository<Student>(new MyContext))
{
repository.Add(myStudentEntity)
repository.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
应该是我们应该尽快处理上下文,否则内存可能会泄漏或变得非常大?
任何人都可以澄清吗?非常感谢.
尽管这样的问题被多次询问,我仍在努力理解存储库和工作单元模式之间的关系.基本上我还是不明白哪个部分会保存/提交数据更改 - 存储库或工作单元?
由于我看到的每个例子都与使用这些和数据库/ OR映射器有关,所以让我们做一个更有趣的例子 - 让数据保存在数据文件中的文件系统中; 根据模式,我应该能够做到这一点,因为数据的去向与此无关.
所以对于一个基本实体:
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想会使用以下接口:
public interface IAccountRepository
{
Account Get(int id);
void Add(Account account);
void Update(Account account);
void Remove(Account account);
}
public interface IUnitOfWork
{
void Save();
}
Run Code Online (Sandbox Code Playgroud)
我认为在使用方面它看起来像这样:
IUnitOfWork unitOfWork = // Create concrete implementation here
IAccountRepository repository = // Create concrete implementation here
// Add a new account
Account account = new Account() …Run Code Online (Sandbox Code Playgroud) 我不确定在我的存储库模式中应该在哪里实现缓存.
我应该在服务逻辑中还是在存储库中实现它?
GUI - > BusinessLogic(服务) - > DataAccess(存储库)
我知道我无法锁定单个mongodb文档,实际上也无法锁定集合.
但是,我有这种情况,我认为我需要一些方法来防止多个线程(或进程,这并不重要)修改文档.这是我的情景.
我有一个包含类型A的对象的集合.我有一些代码检索类型A的文档,在数组中添加元素作为document(a.arr.add(new Thing())的属性,然后将文档保存回mongodb.这段代码是并行的,我的应用程序中的多个线程可以执行这些操作,现在没有办法阻止线程在同一文档上并行执行这些操作.这很糟糕,因为其中一个线程可能会覆盖另一个线程的工作.
我确实使用存储库模式来抽象对mongodb集合的访问,所以我只处理我的处理中的CRUD操作.
现在我考虑一下,也许这是对存储库模式的限制,而不是mongodb的限制导致我的麻烦.无论如何,我怎样才能使这段代码"线程安全"?我想这个问题有一个众所周知的解决方案,但是对mongodb和存储库模式不熟悉,我不会马上看到它.
谢谢
我最近花了很多时间阅读SOLID原则并决定了解我使用的代码库是如何比较的.
在我们的一些代码中有一个存储库(存储库A).当要从存储库A中删除记录时,我们还需要从存储库B中删除关联的记录.因此,原始编码器创建了对存储库B的具体实现的依赖性.存储库A中的方法在事务中并且从存储库A中删除记录,然后调用存储库B上的方法以删除关联的数据.
我对S原理的理解是每个对象应该只有一个改变的理由,但是对于我的存储库A有2个理由要改变?还是我离开了标记?
我发现两种模式似乎有相同的目标 - 有什么区别?
c# ×5
unit-of-work ×2
.net ×1
asp.net-mvc ×1
caching ×1
datamapper ×1
iqueryable ×1
mongodb ×1
try-catch ×1