0

私のデータベースには、「データベース内のすべての列は「nullではない」必要がある」というサードパーティ企業の慣習があります。

現在、EFCodefirstを使用してすべてのテーブルをマッピングしていますが、問題が発生しました。

たとえば、エンティティSA1と1対1の関係にあるエンティティがあり、そのプロパティに空の文字列を持つSA3newを追加したいとします。SA1a1_vend

この問題を解決するために私がしたことは、PKに空の文字列を持つエンティティを追加することでしたSA3が、このアプローチは好きではありませんでした。問題のより良い解決策が欲しいのですが。

私のEFCodefirstクラス:

[ComplexType]
public class Endereco
{
    public string Logradouro { get; set; }
    public string Numero { get; set; }
    public string CEP { get; set; }
}

public class SA3
{
    public string Codigo { get; set; }
    public string Nome { get; set; }
}


public class SA1
{
    public string Codigo { get; set; }
    public string Nome { get; set; }
    public Endereco Endereco { get; set; }
    public Endereco EnderecoCobranca { get; set; }
    public bool IsDeleted { get { return false; } }

    public string a1_vend { get; set; }
    public SA3 Vendedor { get; set; }

    public SA1()
    {
        Endereco = new Endereco();
        EnderecoCobranca = new Endereco();
    }
}


public class SA3Map : EntityTypeConfiguration<SA3>
{
    public SA3Map()
    {


        ToTable("sa3010");

        HasKey(x => x.Codigo);

        Property(x => x.Codigo)
            .HasColumnName("a3_cod");

        Property(x => x.Nome)
            .HasColumnName("a3_nome");
    }
}

public class SA1Map : EntityTypeConfiguration<SA1>
{
    public SA1Map()
    {
        ToTable("sa1010");

        HasKey(x => x.Codigo);

        Property(x => x.Codigo)
            .HasColumnName("a1_cod")
            .IsRequired();
        Property(x => x.Nome)
            .HasColumnName("a1_nome")
            .IsRequired();
        Property(x => x.Endereco.Logradouro)
            .HasColumnName("a1_end")
            .IsRequired();
        Property(x => x.Endereco.Numero)
            .HasColumnName("a1_num")
            .IsRequired();
        Property(x => x.Endereco.CEP)
            .HasColumnName("a1_cep")
            .IsRequired();
        Property(x => x.EnderecoCobranca.Logradouro)
            .HasColumnName("a1_endcob")
            .IsRequired();
        Property(x => x.EnderecoCobranca.CEP)
            .HasColumnName("a1_cepcob")
            .IsRequired();
        Property(x => x.EnderecoCobranca.Numero)
            .HasColumnName("a1_numcob")
            .IsRequired();
        Property(x => x.a1_vend)
            .IsRequired();

        HasRequired(x => x.Vendedor)
            .WithMany()
            .HasForeignKey(x => new { x.a1_vend })
            .WillCascadeOnDelete(false);
    }
}

私のサンプルプログラム:

class Program
{
   static void Main(string[] args)
    {
        MyContext ctx = new MyContext();
        var novoVendedor = new SA3()
        {
            Codigo = "",
            Nome = "Empty, don´t remove this row"
        };
        ctx.Vendedores.Add(novoVendedor);

        var novoCliente = new SA1()
        {
            Codigo = "000001",
            a1_vend = "", //I can´t use null here because my database convention
            Endereco = new Endereco() { Numero = "99", CEP = "13280000", Logradouro = "Rua Teste" },
            Nome = "Cliente S/A",
            EnderecoCobranca = new Endereco { CEP = "13444999", Numero = "S/N", Logradouro = "Rua Cobranca" }
        };
        ctx.Clientes.Add(novoCliente);
        ctx.SaveChanges();



    }
}
4

1 に答える 1

1

以下が当てはまる場合:

  1. SA1->SA3は1対1の関係です。
  2. a1_vend列はテーブルにありますsa1010
  3. a1_vend列をNULL可能にすることはできません

最初に参照するオブジェクトがSA1ないと、オブジェクトを作成できません。SA3

列をnull許容にすることができない場合、他のオプションは、テーブルから列a1_vendを削除し、オブジェクトをオブジェクトにマップするマッピングテーブルを作成することです(2つの列が必要です:これはと同じだと思います)a1_vendsa1010SA1SA3SA1.Codigoa1_vendSA3.Codigo

次にSA1Map、次のように変更します。

        ...
        Property(x => x.EnderecoCobranca.Numero)
            .HasColumnName("a1_numcob")
            .IsRequired();
        //Property(x => x.a1_vend) // removing this
            //.IsRequired();

        HasRequired(x => x.Vendedor)
            .WithMany()
            .Map(m =>
                    {
                        m.ToTable("sa1010sa3010Map");
                        m.MapLeftKey("sa1_Codigo");
                        m.MapRightKey("sa3_Codigo");
                    });
    }
于 2012-06-20T01:38:28.570 に答える