Добавление нового объекта в C # Entity Collection с использованием базового класса - PullRequest
1 голос
/ 12 октября 2019

Я создал метод расширения для коллекции базового класса, который я хотел бы реализовать с помощью своих производных (сущностных) классов. Использование этих классов с Entity Framework Core. Упрощенный пример:

Class BaseClass
{
    DateTime StartDate { get; set; }
    DateTime? EndDate { get; set; }
    DateTime? DeletedAt { get; set; }
}

Class DerivedClass : BaseClass
{
    String Name { get; set; }
}

Мои методы расширения работают с ICollection или IEnumerable из BaseClass. Например, это работает нормально:

public static int DeleteActiveSingleMembershipAndOpenPrevious(this IEnumerable<BaseClass> baseCollection)
{
    var activeMemberships = baseCollection
            .Where(bc =>
                bc.EndDate == null &&
                bc.DeletedAt == null
            );
    if (activeMemberships == null || activeMemberships.Count() != 1)
    {
        return 0;
    }
    else
    {
        activeMemberships.First().DeletedAt = DateTime.Now;
        var nextRecentActive = baseCollection.Where(bc => bc.DeletedAt == null).OrderByDescending(bc => bc.StartDate).FirstOrDefault();
        if (nextRecentActive != null)
        {
            nextRecentActive.EndDate = null;
        }
        return baseCollection.Where(bc => bc.DeletedAt == null).Count();
    }
}

var collectionFromDatabase = _dbContext.DerivedClass;

int total = collectionFromDatabase.DeleteActiveSingleMembershipAndOpenPrevious()

//(THE ABOVE CODE IS WORKING FINE)

Затем я могу (вне метода расширения) сохранить контекст моей базы данных, и изменения сохранятся в базе данных. Однако, когда я пытаюсь добавить новый элемент в коллекцию класса, производного от BaseClass, в моей исходной коллекции не происходит добавления, которое передается методу расширения. Например:

public static int AddNewMembershipRecord(this ICollection<BaseClass> baseCollection, BaseClass newMembership)
{
    var activeMemberships = baseCollection
            .Where(mc =>
                mc.EndDate == null &&
                mc.DeletedAt == null
            );
    //Handle Existing Active Membership
    if (activeMemberships == null || activeMemberships.Count() != 1)
    {
        //Do Nothing
    }
    else
    {
        activeMemberships.First().EndDate = newMembership.StartDate;
    }

    //Add New Membership to Collection
    baseCollection.Add(newMembership);//This add does not get added to the collection that is passed to this method
    //return new total count
    return baseCollection.Where(col => col.DeletedAt == null).Count();
}

var collectionFromDatabase = _dbContext.DerivedClass;
DerivedClass newItem = new DerivedClass
{
    StartDate = DateTime.Now,
    EndDate = null,
    DeletedAt = null,
    Name = "Someone's Name"
}
int total = collectionFromDatabase.AddNewMembershipRecord(newItem);
//collectionFromDatabase at this point remains unchanged.  total will not change.

Я пытался использовать IEnumerable и ICollection в качестве типов параметров (вместо использования метода .Add, я использую метод .Concat, если я 'Я использую IEnumerable в качестве параметра. Я также пытался использовать различные универсальные типы в моем методе расширения для преобразования между BaseClass и DerivedClass, но мне тоже не повезло с этим.

Как добавитьэлемент в коллекцию из контекста базы данных в моем методе расширения, и он сохраняется в коллекции, которая передается (и не остается в области действия в моем методе)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...