2016-07-21 3 views
0

派生クラスインスタンスの基本クラスだけをエンティティコンテキストに保存しようとしていますが、テーブル/クラスの基底が派生しているためエラー "無効な列名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]属性を使用する必要があり、その良い習慣が、私はこの方法ですべての

+0

EFエンティティは部分クラスなので、フィールドを追加するには派生しません。エンティティクラスを展開してフィールドを追加するだけです。次に、コンテキストのSaveChangesメソッドをオーバーライドしてそのプロパティを無視します。 – Victor

答えて

0

最初に思った場合は、エンティティモデルのためのより多くのプロパティを追加したい場合は、知りませんそれはあなたのテーブルには存在しませんでした。例えば

:あなたは、さまざまなmodules.Iのためのエンティティモデルを再利用したい場合は、あなたの場合は

public partial class Person 
{ 
    public int Id { get; set; } 
    public string Nome { get;set;} 
    public DateTime? DateTime { get; set; } 
} 
public partial class Person 
{ 
    [NotMapped] 
    public string ExtendProperties { get;set;} 
} 

は、この方法を提案した:

パーソンモジュール:

public partial class Person 
{ 
    public int Id { get; set; } 
    public string Nome { get;set;} 
    public DateTime? DateTime { get; set; } 
} 

public class PersonMapping : EntityTypeConfiguration<Person> 
{ 
    HasKey(x => x.Id); 
    ToTable("dbo.TB_PESSOA");  
} 
今、あなたは様々なモジュールのためのあなたのエンティティモデルを再利用することができますマッピングの設定に

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Configurations.Add(new PersonMapping()); 
} 

従業モジュール

public partial class Employee : Person 
{ 
    public string EmployeeCode { get; set; } 
} 
public class EmployeeMapping : EntityTypeConfiguration<Employee> 
{ 
    HasKey(x => x.Id); 
    ToTable("dbo.TB_EMPLOYEE");  
} 
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new PersonMapping()); 
} 

を追加する方法210

+0

実際、私のコードでは起こり得ないPersonクラスeを展開したくありませんが、オブジェクトEntidadeFuncionario/Employeeにはプロパティ(DataAdmissao)があります。私はキャストのように私のBLLPessoaBaseクラスでこのオブジェクトを取得します。今のところ、私のコンテキストでEntidadeFuncionario/Employeeを保存したくないのですが(EnteadeFuncionario dbsetはEntidadeFuncionario dbsetを持っています)、C#が例外をスローします。このオブジェクトEmployeeがキャストされていても、このプロパティがオブジェクトEmployee内にあるため、列DataAdmissaoを使用します。EntidadeFuncionario/Employee –

関連する問題