EF和C#:如何在循环

时间:2016-11-01 11:55:49

标签: c# entity-framework

我有三个班叫客户,地址和联系方式。单个客户可能有多个地址,单个地址可能有多个联系人。

查看我的班级结构

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。感谢

1 个答案:

答案 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();

    }