我的数据库有来自第三方公司的约定,“数据库中的所有列都必须'不为空'”。
现在我正在使用EFCodefirst映射所有表,我遇到了一个问题。
例如,我有一个与SA1
实体具有一对一关系的实体SA3
,我想添加一个新的SA1
及其a1_vend
1}}具有空字符串的属性。
我为解决这个问题所做的是在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();
}
}
答案 0 :(得分:1)
如果以下情况属实:
SA1
- &gt; SA3
是一对一的关系。a1_vend
列位于sa1010
表格中。a1_vend
列可以为空如果没有首先引用SA1
对象,您将无法创建SA3
对象。
如果您无法使a1_vend
列可以为空,那么您的另一个选择是从a1_vend
表中删除sa1010
列并创建映射SA1
个对象的映射表到SA3
个对象(只需要两列:SA1.Codigo
和a1_vend
,我猜测它与SA3.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");
});
}