Я нашел решение для создания базы данных без столбца "Discriminator". Это решение подходит для ситуаций, когда мы хотим сохранить схему и таблицы базы данных, а также хотим добавить больше полей в некоторые объекты. Представьте, что вы хотите иметь базу данных для бизнеса A, и вы хотите использовать эту модель dbcontext для бизнеса B, тогда вы можете думать о своем наследовании на уровне базы данных и бизнеса.
OK
отпускает к решению:
предположить, что мы имеем
public class SampleDataContext : DbContext
{
public DbSet<SampleUser> Users { get; set; }
}
[Table("Users")]
public class SampleUser
{
public int Id { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public string Username { get; set; }
public override string ToString() => $"{Username} : {Name} {Family}";
}
Я хочу, чтобы создать новый контекст данных с дополнительными полями на пользователя объекта. также новый контекст данных должен быть полностью совместим с моим текущим уровнем бизнес-логики.
Я предлагаю использовать интерфейсы, как показано ниже:
public interface IDbContext
{
int SaveChanges();
}
public interface IDbSet<TE, in TId>
{
TE Add();
IQueryable<TE> All();
TE Get(TId id);
void Delete(TId id);
}
и изменить SampleDataContext так:
public class SampleDataContext : DbContext,IUserDbContext
{
public DbSet<SampleUser> Users { get; set; }
private IDbSet<SampleUser, int> _userSet;
public IDbSet<SampleUser, int> UserSet
{
get { return _userSet ?? (_userSet = new UserInterface() { Db = this }); }
set { _userSet = value; }
}
public class UserInterface : IDbSet<SampleUser, int>
{
public SampleDataContext Db { get; set; }
public SampleUser Add() => Db.Users.Add(new SampleUser());
public IQueryable<SampleUser> All() => Db.Users;
public SampleUser Get(int id) => Db.Users.Find(id);
public void Delete(int id) => Db.Users.Remove(Get(id));
}
}
также добавить интерфейс для пользователя бизнеса:
public interface IUserDbContext : IDbContext
{
IDbSet<SampleUser, int> UserSet { get; set; }
}
затем мой логический бизнес принимает IUserDbContext вместо SampleDataContext.
public static List<SampleUser> ListUsers(IUserDbContext db)
{
return db.UserSet.All().ToList();
}
этого подходом я могу иметь много баз данных, которые имеют свободные структуры и реализации IUserDbContext поэтому мое использование бизнес-логика может работать с любым из этих контекстов данных.
например, я хочу новую базу данных данных, которая совместима с текущей пользовательской бизнес-логикой, а также имеет дополнительные поля в пользовательской сущности. Мне нравится ниже:
public class MyDataContext : DbContext, IUserDbContext
{
public DbSet<MyUser> Users { get; set; }
private IDbSet<SampleUser, int> _userSet;
public IDbSet<SampleUser, int> UserSet
{
get { return _userSet ?? (_userSet = new UserInterface() { Db = this }); }
set { _userSet = value; }
}
public class UserInterface : IDbSet<SampleUser, int>
{
public MyDataContext Db { get; set; }
public SampleUser Add() => Db.Users.Add(new MyUser());
public IQueryable<SampleUser> All() => Db.Users;
public SampleUser Get(int id) => Db.Users.Find(id);
public void Delete(int id) => Db.Users.Remove(Db.Users.Find(id)??new MyUser());
}
}
[Table("Users")]
public class MyUser : SampleUser
{
public string Color { get; set; }
public override string ToString()
{
return base.ToString() + $"/ color : {Color}";
}
}
Надеюсь, это было полезно или дало вам хорошую идею.
Не использовал бы 'DbSet', как вы предложили создавать таблицы для каждого 'DbSet'? Таким образом, у вас может быть 4 таблицы. Я бы просто придерживался только 'DbSet ' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' например 'Vans => Vehicles.Where (x => x.IsVan);' –
Невозможно, не прибегая к большему количеству неприятностей, таких как конструкторы, которые принимают тип транспортного средства. почему ты хочешь сделать это? Я бы сказал, что вы создаете дискриминатор с вашими булерами, но вы просто не играете в мяч с Entity. –
Возможно, этот подход не подходит для моих целей. Я искал функциональность, где экземпляр грузовика также может быть быстрым. Где я могу сделать что-то вроде 'bool fast = db.Trucks.Find (4) .IsFast' Возможно, мне нужно подумать о ситуации больше с точки зрения транспортных средств, которые могут иметь много ролей. – user868386