为什么数据库第一类与我的代码第一类不同

时间:2014-12-27 14:40:57

标签: c# ef-code-first

我正在从MySql迁移到SQL Server,并使用代码优先在C#中重新编写一个网站(我/是一个vb.net人)。

我写了下面的课程

namespace DomainClasses.GeographyDb
{
  public class PostalCode
  {
    [Key]
    public int PostalCodeId { get; set; }

    [Required]
    [DataType(DataType.PostalCode)]
    public string PostCode { get; set; }

    [Required, ForeignKey("City")]
    public int CityId { get; set; } 

    [Required, ForeignKey("TimeZone")]
    public int TimeZoneId { get; set; }

    [Required, MaxLength(30)]
    public string AreaRegionPhonePrefixCode { get; set; }

    [MaxLength(10)]
    public string TaxRegionCode { get; set; }

    public virtual City City { get; set; }

    public virtual TimeZone TimeZone { get; set; }
}

我想看看实体框架在创建类时会写什么,所以我创建了一个测试项目并首先使用数据库中的代码选项我导入了一个与编写自定义类完全相同的字段的现有数据库。

这是它产生的东西;

namespace CodeFirstCreationTest
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    public partial class postalcode
    {
        public long PostalCodeId { get; set; }

        [Required]
        [StringLength(10)]
        public string PostCode { get; set; }

        public long CityId { get; set; }

        public long TimeZoneId { get; set; }

        [Required]
        [StringLength(10)]
        public string AreaRegionPhonePrefixCode { get; set; }

        [StringLength(10)]
        public string TaxRegionCode { get; set; }

        public virtual city city { get; set; }

        public virtual timezone timezone { get; set; }
    }
}

我对差异有很多疑问;

  1. 为什么Entity Framework将所有using语句放在命名空间声明中?我以为他们总是在外面和代码之前

  2. StringLength是一个数据验证注释。为什么Entity Framework将该属性放在属性上,是不是用于UI验证?现在我想起来了,我总是把Required属性放在类上,那是一个数据验证注释,而不是数据库注释吗?

  3. 它使用流畅的API和modelbuilder创建了一个数据库类。是否更好地注释类属性或使用modelBuilder方法中的OnModelCreating进行注释?

  4. 为什么实体框架使这个类变得局部,显然它所生成的所有类都是部分的?

1 个答案:

答案 0 :(得分:0)

  1. 有时在实际的名称空间声明中生成使用语句。通常没有区别。只是在某些情况下它有点不同。请参阅此答案以获取更多信息,因为它的解释比我能够更好:https://stackoverflow.com/a/151560/1757695
  2. StringLength和Required都是数据库注释,并且在将数据保存到数据库之前执行相应的操作。例如,如果您尝试保存用户并且用户具有使用必需数据注释修饰的UserName属性,则只有在调用SaveChanges方法时才会出现错误,而不是在为属性指定值时出现错误。
  3. 我认为这是个人偏好。我更喜欢数据注释和尽可能少的流畅API。您仍然可以使用数据注释来处理某些事情,但可以使用流畅的API。