Вы можете использовать мою библиотеку EntityFrameworkCoreMock в качестве базы, см. https://github.com/huysentruitw/entity-framework-core-mock
, а затем переопределить поведение SaveChanges
такой метод:
dbContextMock.Setup(x => x.SaveChanges()).Callback(() => throw new Exception());
К сожалению, base
только для чтения.
[Править]
Хорошо, возможно, не настолько неудачный. Отношения между базовым классом и дочерним классом IS-A
нет HAS-A
. Позволяя дочернему классу изменить экземпляр базового класса Вы позволяете дочернему классу изменять свою собственную ссылку начиная с него IS-A
базовый класс. Если бы Вам действительно нужна эта функциональность затем, я предложил бы, чтобы Вы изменили свою модель наследования для отражения то, что Вы действительно хотите сделать.
Что-то вроде этого:
public class A
{
public string field1;
public string field2;
}
public class B
{
public string field3;
public A a;
public void Assign(A source)
{
this.a = source;
}
}
кажется более соответствующим и имеет более четкое значение и функциональность.
В то время как существует много превосходных ответов здесь, я думаю надлежащий способ сделать, это путем объединения в цепочку конструкторов:
public class A
{
public string field1;
public string field2;
public A(string field1, string2 field2)
{
this.field1 = field1;
this.field2 = field2;
}
}
public class B : A
{
public string field3;
public B(string field1, string2 field2, string field3)
: base(field1, field2)
{
this.field3 = field3;
}
}
Состоит в том намерение, что эти поля будут инициализированы однажды во время объектной конструкции или могли "Присвоиться" быть названными многократно в течение времени жизни объекта? Если последний, можно игнорировать остальную часть этого :)
Различие Andrew между ISA и ИМЕЕТ - A, важный; если отношениями действительно является - A, его решением для состава является способ пойти.
Если отношения ISA имеют больше смысла (и Вы можете изменить A), конструктор копии мог бы быть хорошей идеей:
public class A
{
public string field1;
public string field2;
public A(A copyFrom)
{
this.field1 = copyFrom.field1;
this.field2 = copyFrom.field2;
}
}
public class B : A
{
public string field3;
public B(A source)
: base(source)
{
}
}
Вы заканчиваете тем, что имели необходимость скопировать каждое из свойств A, но ответственность за то, что сделали так находится в, где это принадлежит.
public Assign(A a)
{
foreach (var prop in typeof(A).GetProperties())
{
this.GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(a, null),null);
}
}
В основном это использует отражение, чтобы получить все свойства основы и присвоить значения этого ко всем значениям, которые существуют в A.
Править: Ко всему Вы голосующие против там, я быстро протестировал это теперь с базовым классом, который имел 100 целочисленных переменных. Я затем имел, это присваивает метод в подклассе. Потребовалось 46 миллисекунд для выполнения. Я не знаю о Вас, но я соглашаюсь полностью с этим.
Нет синтаксис, который Вы пробуете, не возможен в.NET C#, которую необходимо сделать.
public void Assign(A source) {
field1 = source.field1;
field2 = source.field2;
}
Я надеюсь, что я не единственный, кто думает, выгружая Ваш базовый класс, плохой шаблон разработки. Другой подход должен заменить наследование составом:
public class A
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
public class B
{
public A A { get; set; }
public string Field3 { get; set; }
public B(A a) { this.A = a; }
}
Теперь его тривиальное для записи чего-то вроде этого:
B b = new B ( new A { Field1 = "hello", Field2 = "world" } );
b.A = new A { Field1 = "hola", Field2 = "luna" };
Почему Вы должны были бы? Путем объявления нового B CLR автоматически вызывает конструкторов для обоих классов.
B myB = new B();
B новый имеет поля обоих классов. Однако необходимо объявить их с инициализатором, если Вам не нравится, аннулирует:
public string field1 = "";
public string field2 = string.Empty;
Неправильный вопрос. Вы, очевидно, злоупотребляете наследованием здесь. Попытайтесь осуществить рефакторинг его, так, чтобы Вы сохранили ссылку на как членское поле. Если Вы нуждаетесь в полиморфизме, рассматриваете общий базовый класс наличия или еще лучше - интерфейс.
Согласно MSDN, "основа" может внутренне использоваться для следующих операций: