非必需对象字段

时间:2015-08-03 17:00:36

标签: c# asp.net-mvc entity-framework asp.net-web-api ef-code-first

我有一个ASP.NET MVC网站,它将ViewModels传递给WebAPI服务,以便首先使用Entity Framework代码对数据库中的对象执行CRUD操作。

我的一个域实体对象是一个业务,它包含业务信息,地址,主要联系人和次要联系人。问题是,不需要辅助联系对象,因为并非所有公司都有辅助联系人。我已将ID字段设置为可空,但是当我尝试将新业务记录保存到没有辅助联系对象的数据库时,它会给出实体验证错误,即需要辅助联系人记录字段。

有没有人知道如何阻止此错误,以便我可以在没有辅助联系人的情况下将业务实体保存在数据库中?

以下是相关代码。我正在使用automapper在我的视图模型和模型之间进行映射。

域业务对象

    public class Business
{
    public Guid PrimaryContactId { get; set; }
    [ForeignKey("PrimaryContactId")]
    [Required]
    public virtual Contact PrimaryContact { get; set; }

    public Guid? SecondaryContactId { get; set; }
    [ForeignKey("SecondaryContactId")]
    public virtual Contact SecondaryContact { get; set; }

    [Key]
    public Guid Id { get; set; }

    [Required]
    [MaxLength(100)]
    public string CompanyName { get; set; }

    [MaxLength(100)]
    public string CompanyWebsite { get; set; }

    [Required]
    [MaxLength(100)]
    public string Industry { get; set; }

    [Required]
    public NumberOfEmployees NumberOfEmployees { get; set; }

    [Required]
    public CommunicationPreference CommunicationPreference { get; set; }

    public Guid AddressId { get; set; }

    [ForeignKey("AddressId")]
    [Required]
    public virtual Address Address { get; set; }
}

商家视图模型

public class BusinessViewModel
{
    public Guid PrimaryContactId { get; set; }
    public PrimaryContactViewModel PrimaryContact { get; set; }

    public Guid? SecondaryContactId { get; set; }
    public SecondaryContactViewModel SecondaryContact { get; set; }

    public Guid Id { get; set; }

    [DisplayName("Company Name")]
    [Required]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public string CompanyName { get; set; }

    [DisplayName("Company Website")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public string CompanyWebsite { get; set; }

    [DisplayName("Industry")]
    [Required]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public string Industry { get; set; }

    [DisplayName("Number of Employees")]
    [Required]
    public NumberOfEmployees NumberOfEmployees { get; set; }

    [DisplayName("Communication Preference")]
    [Required]
    public CommunicationPreference CommunicationPreference { get; set; }

    public Guid AddressId { get; set; }
    [Required]
    public AddressViewModel Address { get; set; }
}

域名联系对象

    public class Contact
{
    [Key]
    public Guid Id { get; set; }

    [Required]
    public Salutations? Prefix { get; set; }

    [Required]
    [MaxLength(100)]
    public string FirstName { get; set; }

    [Required]
    [MaxLength(100)]
    public string LastName { get; set; }

    [Required]
    [MaxLength(100)]
    public string JobTitle { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [MaxLength(100)]
    public string Email { get; set; }

    [Required]
    [MaxLength(100)]
    public string Phone { get; set; }

    [MaxLength(100)]
    public string PhoneExtension { get; set; }
}

基本联系人视图模型

    public class BaseContactViewModel
{
    public Guid Id { get; set; }

    [DisplayName("Primary Contact Prefix")]
    public virtual Salutations Prefix { get; set; }

    [DisplayName("Primary Contact First Name")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public virtual string FirstName { get; set; }

    [DisplayName("Primary Contact Last Name")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public virtual string LastName { get; set; }

    [DisplayName("Primary Contact Job Title")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public virtual string JobTitle { get; set; }

    [DisplayName("Primary Contact Email Address")]
    [DataType(DataType.EmailAddress)]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public virtual string Email { get; set; }

    [DisplayName("Primary Contact Phone")]
    [DataType(DataType.PhoneNumber)]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public virtual string Phone { get; set; }

    [DisplayName("Primary Contact Extension")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public virtual string PhoneExtension { get; set; }
}

辅助联系人视图模型

public class SecondaryContactViewModel : BaseContactViewModel
{

    [DisplayName("Secondary Contact Prefix")]
    public override Salutations Prefix { get; set; }

    [DisplayName("Secondary Contact First Name")]
    public override string FirstName { get; set; }

    [DisplayName("Secondary Contact Last Name")]
    public override string LastName { get; set; }

    [DisplayName("Secondary Contact Job Title")]
    public override string JobTitle { get; set; }

    [DisplayName("Secondary Contact Email Address")]
    public override string Email { get; set; }

    [DisplayName("Secondary Contact Phone")]
    public override string Phone { get; set; }

    [DisplayName("Secondary Contact Extension")]
    public override string PhoneExtension { get; set; }

}

执行EF保存的方法

public async Task<bool> CreateBusinessAsync(BusinessViewModel businessViewModel)
    {
        try
        {
            // TODO: Move mapping to some common place?
            Mapper.CreateMap<BusinessViewModel, Business>();
            Mapper.CreateMap<BaseContactViewModel, Contact>();
            Mapper.CreateMap<AddressViewModel, Address>();


            Business business = Mapper.Map<Business>(businessViewModel);

            //TODO: See why EntityFramework isn't automatically putting in GUIDs
            business.Id = Guid.NewGuid();
            business.Address.Id = Guid.NewGuid();
            business.PrimaryContact.Id = Guid.NewGuid();


            // Attach the objects so they aren't saved as new entries
            db.States.Attach(business.Address.State);
            db.Countries.Attach(business.Address.Country);

            //TODO: See why entity framework isn't automatically saving records
            var bus = db.Businesses.Add(business);
            var primary = db.Contacts.Add(business.PrimaryContact);

            if (!String.IsNullOrEmpty(business.SecondaryContact.FirstName))
            {
                business.SecondaryContact.Id = Guid.NewGuid();
                db.Contacts.Add(business.SecondaryContact);
            }
            else
            {
                business.SecondaryContact = null;
            }


            var address = db.Addresses.Add(business.Address);

            int rowsAffected = await db.SaveChangesAsync();


            if (bus != null && rowsAffected > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception e)
        {
            //TODO: Add exception logger
            string error = e.Message;

            return false;
        }

    }

请告诉我是否有任何其他课程有用。感谢。

1 个答案:

答案 0 :(得分:0)

之前我遇到过类似的问题,我修复它的方法是从属性中取出外键数据注释并使用fluent-api。使用fluent-api我只是将关系的正确边标记为可选。