派生クラスインスタンスの基本クラスだけをエンティティコンテキストに保存しようとしていますが、テーブル/クラスの基底が派生しているためエラー "無効な列名xxx"フィールド、それは正しいです。それを派生表現するテーブル/クラスが存在する:派生クラスのクラスベースをエンティティに保存する
class Program
{
static void Main(string[] args)
{
EntidadeFuncionario func = new EntidadeFuncionario();
func.TipoPessoa = "F";
func.Nome = "A";
func.DataAdmissao = DateTime.Now;
BLLFuncionario bllFunc = new BLLFuncionario();
if (bllFunc.Salvar(func))
Console.Write("Sucesso!");
else
Console.Write("Falha");
Console.ReadLine();
}
}
public abstract class EntidadePessoa
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; }
public string Nome{get;set;}
public DateTime? DataNascimento { get; set; }
public string TipoPessoa { get; set; }
}
public class EntidadeFuncionario : EntidadePessoa
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; }
public DateTime? DataAdmissao { get; set; }
}
public class BLLFuncionario : BLLPessoaBase
{
public override bool Salvar(EntidadePessoa func)
{
if (base.Salvar((EntidadePessoa)func))
{
if (((EntidadeFuncionario)func).DataAdmissao != DateTime.MinValue)
{
Console.WriteLine("func salvo");
return true;
}
}
return false;
}
}
public abstract class BLLPessoaBase
{
ContextWN context = new ContextWN();
public virtual bool Salvar(EntidadePessoa pessoa)
{
if (!string.IsNullOrEmpty(pessoa.Nome))
{
context.Pessoas.Add(pessoa);
context.SaveChanges();
Console.WriteLine("Pessoa salva");
return true;
}
return false;
}
}
public class ContextWN : DbContext
{
public ContextWN()
: base("WNEntities")
{
}
public DbSet<EntidadePessoa> Pessoas { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EntidadePessoa>().ToTable("TB_PESSOA");
}
}
Iが表TB_PESSOA(ID、ノーム、DataNascimento、TipoPessoa)及びTB_FUNCIONARIO(ID、DataAdmissao、IdPessoa [FK])
を有しますEntidadeFuncionario/Employeeオブジェクトのプロパティ(DataAdmissao)です。私はキャストのように私のBLLPessoaBaseクラスでこのオブジェクトを取得します。今のところ、私のコンテキストでEntidadeFuncionario/Employeeを保存したくないのですが(EnteadeFuncionario dbsetはEntidadeFuncionario dbsetを持っています)、C#が例外をスローします。私の考えでは、Pessoa/Personモジュールを独立したDLLに保ち、 のようなユーティリティと様々なプロジェクトを再利用できるようになりました。このオブジェクトはEmployeeオブジェクト内に存在するため、この列はオブジェクトEmployee内にあるため、列DataAdmissaoが使用されています。 Funcionario/Employeeモジュールの例Funcionario/Employeeモジュールは、 "Pessoa/Person"を保存した後、あなたの特定の "保存"を行います。私はあなたがそれらの列のための部分的なクラスと[NotMapped]属性を使用する必要があり、その良い習慣が、私はこの方法ですべての
EFエンティティは部分クラスなので、フィールドを追加するには派生しません。エンティティクラスを展開してフィールドを追加するだけです。次に、コンテキストのSaveChangesメソッドをオーバーライドしてそのプロパティを無視します。 – Victor