我有三个班叫客户,地址和联系方式。单个客户可能有多个地址,单个地址可能有多个联系人。
public class CustomerBase
{
public int CustomerID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[NotMapped]
public string Address1 { get; set; }
[NotMapped]
public string Address2 { get; set; }
[NotMapped]
public string Phone { get; set; }
[NotMapped]
public string Fax { get; set; }
}
public class Customer : CustomerBase
{
public virtual List<Addresses> Addresses { get; set; }
}
public class Addresses
{
[Key]
public int AddressID { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public bool IsDefault { get; set; }
public virtual List<Contacts> Contacts { get; set; }
public int CustomerID { get; set; }
public virtual Customer Customer { get; set; }
}
public class Contacts
{
[Key]
public int ContactID { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public bool IsDefault { get; set; }
public int AddressID { get; set; }
public virtual Addresses Customer { get; set; }
}
地址和联系人类具有序列号字段,其值将类似于1,2或3,但基于客户或地址ID。
客户ID 1可能有多个地址,每个地址序列号将是1,2,3等,客户ID 2可能有多个地址,每个地址序列号将再次为1,2,3等。
我无法创建该字段自动编号,因为两个客户地址序列号可能具有相同的值。
如果我一次保存这种方式来插入客户及其多个地址,并且每个地址都有自己的联系方式,那么我怎么能指定序列号的值。看我的示例代码。
using (var db = new TestDBContext())
{
var customer = new Customer
{
FirstName = "Test Customer1",
LastName = "Test Customer1",
Addresses = new List<Addresses>
{
new Addresses
{
Address1 = "test add1",
Address2 = "test add2",
IsDefault=true,
Contacts = new List<Contacts>
{
new Contacts { Phone = "1111111", Fax = "1-1111111",IsDefault=true },
new Contacts { Phone = "2222222", Fax = "1-2222222",IsDefault=false }
}
},
new Addresses
{
Address1 = "test add3",
Address2 = "test add3",
IsDefault=true,
Contacts = new List<Contacts>
{
new Contacts { Phone = "33333333", Fax = "1-33333333",IsDefault=false },
new Contacts { Phone = "33333333", Fax = "1-33333333",IsDefault=true }
}
}
}
};
db.Customer.Add(customer);
db.SaveChanges();
}
如果有方法为serial no手动指定值,那么请用代码示例分享知识。
我想我必须在循环中插入子记录。首先,我需要插入客户并保留插入的客户ID,然后使用客户ID查询地址表,以查找该客户ID的地址表中存在的任何数据。如果没有,则在循环中插入地址详细信息并手动分配序列号并循环递增。如果客户已经存在于特定客户的地址表中,那么我必须获得max serial no value并再次在循环中插入详细信息并分配序列号=最大序列号+1。
请指导我如何克服这个问题,因为我不擅长EF。感谢
答案 0 :(得分:0)
using (var db = new TestDBContext())
{
var customer = new Customer
{
FirstName = "Test Customer1",
LastName = "Test Customer1",
};
db.Customer.Add(customer);
db.SaveChanges();
int CustomerID = customer.CustomerID;
Addresses oAdr = new Addresses();
oAdr.Address1 = "test add1";
oAdr.Address2 = "test add2";
oAdr.IsDefault = true;
oAdr.CustomerID = CustomerID;
oAdr.SerialNo = 1;
db.Addresses.Add(oAdr);
db.SaveChanges();
int AddressID = oAdr.AddressID;
Contacts oContacts = new Contacts();
oContacts.Phone = "1111111";
oContacts.Fax = "1-1111111";
oContacts.SerialNo = 1;
oContacts.IsDefault = true;
oContacts.AddressID = AddressID;
db.Contacts.Add(oContacts);
db.SaveChanges();
oContacts = new Contacts();
oContacts.Phone = "222222222";
oContacts.Fax = "2-1111111";
oContacts.SerialNo = 2;
oContacts.IsDefault = false;
oContacts.AddressID = AddressID;
db.Contacts.Add(oContacts);
db.SaveChanges();
oAdr = new Addresses();
oAdr.Address1 = "test add3";
oAdr.Address2 = "test add3";
oAdr.SerialNo = 2;
oAdr.IsDefault = false;
oAdr.CustomerID = CustomerID;
db.Addresses.Add(oAdr);
db.SaveChanges();
AddressID = oAdr.AddressID;
oContacts = new Contacts();
oContacts.Phone = "33333333";
oContacts.Fax = "3-1111111";
oContacts.IsDefault = true;
oContacts.SerialNo = 1;
oContacts.AddressID = AddressID;
db.Contacts.Add(oContacts);
db.SaveChanges();
oContacts = new Contacts();
oContacts.Phone = "444444444";
oContacts.Fax = "4-1111111";
oContacts.SerialNo = 2;
oContacts.IsDefault = false;
oContacts.AddressID = AddressID;
db.Contacts.Add(oContacts);
db.SaveChanges();
}