Created classes is only set in context in the method OnModelCreating
or even by Dataannotations, this minimum example is configured by the method OnModelCreating
:
public class Pessoa
{
public int PessoaId { get; set; }
public string Nome { get; set; }
}
public class Cliente: Pessoa
{
public string CPF { get; set; }
}
using Microsoft.EntityFrameworkCore;
public class Ctx: DbContext
{
public Ctx()
{
//Database.EnsureCreated();
}
public DbSet<Pessoa> Pessoa { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string cn = "Server=.\\SQLExpress;Database=MyDataBaseEntityCore;";
cn += "User Id=sa;Password=senha;";
optionsBuilder.UseSqlServer(cn, c =>
{
});
}
//configurando as classes
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Pessoa>()
.ToTable("Pessoa")
.ForSqlServerToTable("Pessoa")
.HasKey(x => x.PessoaId);
modelBuilder.Entity<Pessoa>()
.Property(x => x.PessoaId)
.IsRequired()
.UseSqlServerIdentityColumn();
modelBuilder.Entity<Pessoa>()
.Property(x => x.Nome)
.HasMaxLength(100)
.IsRequired();
modelBuilder.Entity<Cliente>()
.ForSqlServerToTable("Cliente")
.ToTable("Cliente");
modelBuilder.Entity<Cliente>()
.Property(x => x.CPF)
.IsRequired()
.HasMaxLength(20);
}
}
One point to note is that this version (1.1.2
) of the Entity Framework Core, even configuring the tables, does not generate a table for each type (as requested in the question), but a field Discriminator
to identify to which type that record belongs, I believe to be a limitation still of the version.
Remarks: Just remembering that this setting is for Entity Framework Core 1.1.2
to the bank SQLServer
, this being the most stable, but, is in the oven almost ready version 2.0.0
, that will bring many changes.
Operations:
Add new Cliente
:
using (Ctx c = new Ctx())
{
c.Pessoa.Add(new Cliente
{
CPF = "111.111.111-11",
Nome = "StackOverFlow Core"
});
c.SaveChanges();
}
Edit Cliente
of PessoaId = 1
:
using (Ctx c = new Ctx())
{
Cliente cliente = c.Pessoa
.OfType<Cliente>()
.FirstOrDefault(x => x.PessoaId == 1);
if (cliente != null)
{
cliente.Nome = "StackOverFlow Core + Update";
c.SaveChanges();
}
}
Rule out Cliente
of PessoaId = 1
:
using (Ctx c = new Ctx())
{
Cliente cliente = c.Pessoa
.OfType<Cliente>()
.FirstOrDefault(x => x.PessoaId == 1);
if (cliente != null)
{
c.Pessoa.Remove(cliente);
c.SaveChanges();
}
}
Fetch Cliente
of PessoaId = 2
:
using (Ctx c = new Ctx())
{
Cliente cliente = c.Pessoa
.OfType<Cliente>()
.FirstOrDefault(x => x.PessoaId == 2);
if (cliente != null)
{
}
}
References
Thanks Virgilio Novic. I tried everything but it didn’t work. Unfortunately, as you said, it should still be a limitation of the version. I will wait... :)
– Master JR