小编Mat*_*tin的帖子

具有数据库事务的工作单元模式

我已经尝试过几天了解这个问题,并且有很多关于工作单元和TransactionScope的教程,但我找不到任何关于这两者的内容.任何帮助非常感谢!

我正在使用Entity Framework和Unit Of Work模式以及每种类型的存储库.根据下面的简单代码,我有一个Member和MembershipDefinition实体.我想创建一个链接两者的Membership实体,但是当我创建Membership对象时,我想根据一些业务逻辑查询DB的最大值.因此,我需要使用某种DB事务来阻止另一个线程在我的线程将Membership对象写回DB之前递增db中的值.

如果我使用存储过程,这将非常简单,但我无法弄清楚如何使用纯c#...

下面的代码在数据库中创建了100个Membership实体,其中包含重复的MembershipNumbers.我需要使用这种方法来使用事务来确保c#代码中生成的所有成员编号都是唯一的.

class Program
{
    static void Main(string[] args)
    {
        var p = new Program();
        p.Go();;
    }

    public void Go()
    {
        long memberId;
        long membershipDefId;

        using(var unitOfWork = new UnitOfWork())
        {
            // Setup - create test club and member entities

            var testUsername = ("TestUserName" + Guid.NewGuid()).Substring(0, 29);
            var member = new Member()
                             {
                                 UserName = testUsername
                             };

            var testmemebrshpDefName = ("TestMembershipDef" + Guid.NewGuid()).Substring(0, 29);
            var membershipDefinition = new ClubMembershipDefinition()
            {
                ClubId = 1, …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework transactions transactionscope

7
推荐指数
1
解决办法
1万
查看次数

与有限订阅者同时订阅可观察集合的简单方法

我一直在尝试使用Rx和可观察集合实现一个简单的生产者 - 消费者模式.我还需要能够轻松限制用户数量.我在并行扩展中看到过很多对LimitedConcurrencyLevelTask​​Scheduler的引用,但我似乎无法使用多个线程.

我想我做的很傻,所以我希望有人可以解释一下.在下面的单元测试中,我希望使用多个(2)线程来使用阻塞集合中的字符串.我究竟做错了什么?

[TestClass]
public class LimitedConcurrencyLevelTaskSchedulerTestscs
{
    private ConcurrentBag<string> _testStrings = new ConcurrentBag<string>();
    ConcurrentBag<int> _threadIds= new ConcurrentBag<int>();

    [TestMethod]
    public void WhenConsumingFromBlockingCollection_GivenLimitOfTwoThreads_TwoThreadsAreUsed()
    {

        // Setup the command queue for processing combinations
        var commandQueue = new BlockingCollection<string>();

        var taskFactory = new TaskFactory(new LimitedConcurrencyLevelTaskScheduler(2));
        var scheduler = new TaskPoolScheduler(taskFactory);

        commandQueue.GetConsumingEnumerable()
            .ToObservable(scheduler)
            .Subscribe(Go, ex => { throw ex; });

        var iterationCount = 100;
        for (int i = 0; i < iterationCount; i++)
        {
            commandQueue.Add(string.Format("string {0}", i));
        }
        commandQueue.CompleteAdding();

        while (!commandQueue.IsCompleted)
        {
            Thread.Sleep(100); …
Run Code Online (Sandbox Code Playgroud)

c# concurrency observablecollection parallel-extensions system.reactive

1
推荐指数
1
解决办法
1699
查看次数

C#通用方法声明

我有一个问题,我正在尝试创建泛型方法的签名.

课程如下:

public class MarketDataRepository : IRepository
{
    MarketWatchEntities _dbContext = new MarketWatchEntities();

    public MarketDataRepository(){}

    public MarketDataRepository(MarketWatchEntities dbContext)
    {
        _dbContext = dbContext;
    }

    public IEnumerable<T> GetMarketData<T>(DateTime startDateTime, DateTime endDateTime ) where T : MarketDataPoint
    {
        return _dbContext.MarketDataPoints.Where(x => x.ReferenceDateTime >= startDateTime && x.ReferenceDateTime <= endDateTime).ToList();
    }
}

public interface IRepository
{
    IEnumerable<T> GetMarketData<T>(DateTime startDateTime, DateTime endDateTime) where T : MarketDataPoint;
}
Run Code Online (Sandbox Code Playgroud)

附加信息:
MarketWatchEntitiesextends DbContext(由Entity Framework生成).

我得到这个编译时异常:

Cannot implicitly convert type 'System.Collections.Generic.List<MarketWatcher.Domain.MarketDataPoint>' to 'System.Collections.Generic.IEnumerable<T>'. An explicit conversion exists (are …
Run Code Online (Sandbox Code Playgroud)

c# generics inheritance

0
推荐指数
1
解决办法
639
查看次数