2014-12-27 69 views
0

我正在从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. 为什么实体框架将所有using语句放在命名空间声明中?我以为他们总是在外面,之前的代码

  2. StringLength是一个数据验证注释。为什么实体框架将该属性放在属性上,这不是用于UI验证的吗?现在我想到了它,我总是在类上放置Required属性,是否也是数据验证注释,而不是数据库注释?

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

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

回答

0
  1. 使用报表的实际命名空间声明中有时会产生。通常没有区别。只有在某些情况下,它有点不同。请参阅此答案以获取更多信息,因为它的解释比我能做到的要好:https://stackoverflow.com/a/151560/1757695
  2. StringLength和Required都是数据库注释,相应的操作在将数据保存到数据库之前执行。例如,如果您尝试保存用户并且用户具有用Required数据注释修饰的UserName属性,则只有在调用SaveChanges方法时才会出错,而不是在将值分配给属性时出错。
  3. 我相信这是个人喜好。我更喜欢数据注释和尽可能少的流利的API。还有一些事情你不能用数据注释做,但可以用流畅的API来完成。
+0

您对#2的回答没有对我在发布后发现的内容进行调整 – dinotom 2014-12-27 15:16:14

+0

MaxLength用于实体框架来决定创建数据库时字符串值字段的大小。 来自MSDN: 指定属性中允许的数组或字符串数​​据的最大长度。 StringLength是将用于验证用户输入的数据注释。 来自MSDN: 指定数据字段中允许的字符的最小和最大长度。 – dinotom 2014-12-27 15:16:44

+0

嗯,我想你问过Required和StringLength是数据库注释还是数据验证注释。也许我误解了。 – Phoenix 2014-12-27 21:43:55

相关问题