实体框架代码首先为模型上不存在的属性生成DB列

时间:2013-09-03 09:16:12

标签: c# entity-framework ef-code-first

我首先使用Entity framework 5.0代码。我的模型类看起来像这样:

    public class Client
{
    public Client()
    {
    }

    public int ClientID { get; private set; }
    [Required]
    public string CustomerNumber { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    [Required]
    public MeritalStatus MeritalStatus { get; set; }
    public DateTime? BirthDate { get; set; }
    public Gender Gender { get; set; }
    public string Email { get; set; }

    public string Salutation { get; set; }

    public string GetFullName()
    {
        return this.FirstName + " " + this.LastName;
    }
}

我在global.asax中使用DropCreateDatabase初始化程序:

Database.SetInitializer<SiteObjectContext>(new DropCreateDatabaseIfModelChanges<SiteObjectContext>());

因此,每次模型更改时都会重新创建数据库。

生成的数据库表如下所示:

CREATE TABLE [dbo].[Clients](
[ClientID] [int] IDENTITY(1,1) NOT NULL,
[CustomerNumber] [nvarchar](max) NOT NULL,
[FirstName] [nvarchar](max) NOT NULL,
[LastName] [nvarchar](max) NOT NULL,
[MeritalStatus] [int] NOT NULL,
[BirthDate] [datetime] NULL,
[Gender] [int] NOT NULL,
[Email] [nvarchar](max) NULL,
[Salutation] [nvarchar](max) NULL,
[Visa_VisaID] [int] NULL)

它以某种方式产生冗余列Visa_VisaID 在模型上不存在。我怀疑它可能是一种缓存,因为它可能 我之前在桌子上有这个专栏。 尝试手动删除数据库,使用EF 6 RC而不是5.0,没有任何帮助,列 重新出现在每个数据库娱乐中。

签证实体:

    public class Visa
{
    public Visa()
    {
    }

    public int VisaID { get; set; }
    [Required]
    public int ApplicationId { get; private set; }
    [ForeignKey("ApplicationId")]
    public virtual VisaApplication Application { get; set; }
    public int MainApplicantId { get; private set; }
    [ForeignKey("MainApplicantId")]
    public virtual Client MainApplicant { get; set; }
    public virtual ICollection<Client> IncludedCustomers { get; set; }
    public int VisaTypeId { get; private set; }
    [ForeignKey("VisaTypeId")]
    public virtual VisaType VisaType { get; set; }
    public DateTime StartDate { get; set; }
    [Required]
    public bool IsMultiple { get; set; }
    [Required]
    public DateTime ExpiryDateStay { get; set; }
    public DateTime ExpiryDateTravel { get; set; }
    [Required]
    public DateTime FirstEntryBy { get; set; }
    [Required]
    public string Number { get; set; }
}

}

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

由于Visa.IncludedCustomers属性,您的Visa_VisaID列已创建。 Visa_VisaID字段是一对多关系Visa-Clients签证的FK。创建它是因为关联不被视为双向关联。 如果您的案例是多对多关系,那么您应该覆盖DbContext的OnModelCreating以更改客户端和Visa之间的映射:

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<Visa>().HasMany(v => v.IncludedCustomers).WithMany();
}

这将创建一个表VisaIncludedCustomers表,其中两个Id列作为外键(对于Visa和Client)。