Я создал метод расширения для коллекции базового класса, который я хотел бы реализовать с помощью своих производных (сущностных) классов. Использование этих классов с 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, но мне тоже не повезло с этим.
Как добавитьэлемент в коллекцию из контекста базы данных в моем методе расширения, и он сохраняется в коллекции, которая передается (и не остается в области действия в моем методе)?