Моя модель имеет базовый класс, который НЕ является абстрактным и не имеет определенного ключа (это внешний класс, который я не могу изменить). Вместо этого я определил производный класс с свойством MyID
. Что-то вроде этого:Как игнорировать не абстрактный базовый класс в Entity Framework?
public class MyBaseClass // From external assembly
{
//public int ID { get; set; }
public string Name { get; set; }
}
public class MyClass // From external assembly
{
public int ID { get; set; }
public List<MyBaseClass> Objects { get; set; }
}
public class MyDerivedClass : MyBaseClass
{
public Guid MyID { get; set; }
public MyDerivedClass()
{
MyID = Guid.NewGuid();
}
}
public class MyClasses : DbContext
{
public DbSet<MyClass> Classes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyDerivedClass>().HasKey(entity => entity.MyID);
modelBuilder.Entity<MyDerivedClass>().Map(entity =>
{
entity.MapInheritedProperties();
entity.ToTable("MyBaseClass");
});
modelBuilder.Ignore<MyBaseClass>();
}
}
class Program
{
static void Main(string[] args)
{
Database.SetInitializer<MyClasses>(new DropCreateDatabaseIfModelChanges<MyClasses>());
var myClass = new MyClass() // Just as example, in real code is somethog like: MyClass myClass = ExtenalAssembly.getMyClass()
{
ID = 0,
Objects = new List<MyBaseClass>()
{
new MyBaseClass()
{
//ID = 0,
Name = "My Test Object 1"
},
new MyBaseClass()
{
//ID = 1,
Name = "My Test Object 2"
}
}
};
Mapper.CreateMap<MyBaseClass, MyDerivedClass>();
for (var index = 0; index < myClass.Objects.Count; index++)
{
myClass.Objects[index] = Mapper.Map<MyDerivedClass>(myClass.Objects[index]);
}
var myObjects = new MyClasses();
myObjects.Classes.Add(myClass);
myObjects.SaveChanges();
}
}
Если я закомментируйте строку modelBuilder.Ignore<MyBaseClass>();
среда выполнения генерирует исключение, потому что MyBaseClass
не имеет ключевое значение; с другой стороны, когда я включаю эту строку, чтобы не сохранять состояние экземпляра базового класса, а только состояние экземпляра производного класса, система не сохраняет никаких данных в сгенерированных таблицах.
Что мне делать, чтобы сохранить только состояние производного экземпляра?
Вы должны переместить идентификатор базового класса или предоставить Id удостоверений в этом классе. – Fals
@Fals Какая часть * это внешний класс, который я не могу изменить * вы пропустили? :) – MarcinJuraszek