【问题标题】:How to control database parameters with Entity Framework如何使用实体框架控制数据库参数
【发布时间】:2014-01-22 06:38:13
【问题描述】:

我将 EF 与我使用 c# 的 asp.net mvc 项目一起使用。

我现在正忙于设计数据模型,我想知道是否有一种方法可以控制每个属性的某些属性,不仅在模型对象中,而且在持久存储中(在我的例子中是 MS SQL)。

这是我当前领域模型的一个示例。

public class Network
{
    [Required]
    public int networkID { get; set; }

    [Required]
    [StringLength(30, MinimumLength = 3)]
    [DisplayName("Name")]
    public string name { get; set; }

    [Required]
    [Range(0, 7)]
    [DisplayName("Start Code")]
    public int startCode { get; set; }

    [Required]
    [DisplayName("Frequency (Mhz)")]
    public decimal frequency { get; set; }
    //public virtual List<Block> blocks { get; set; }

    //The number of used up blocks. Will increase by the block size of every newly created block.
    [Required]
    [Range(0, 65535)]
    public int blockCounter { get; set; }

    //Number of blocks within the network.
    [Range(0,65535)]
    public int noOfBlocks { get; set; }
}

现在与此相关的问题:

这一行:

[Range(0,65535)]
public int noOfBlocks { get; set; }  

这实际上会将数据库中的 int 限制为该大小吗?还是纯粹出于验证目的?

如果不是,我如何定义有关特定属性的某些属性,例如:

  • 如果是主键?
  • 设置默认值。
  • 指定字段的长度或范围。
  • 定义是否可以为空。

基本上是 MS SQL 在创建条目时提供的功能。

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework orm domain-model


    【解决方案1】:

    有几种方法可以影响EF-CodeFirstStorageModel。我能想到的两种方法是AttributeFluent-Registration

    Data Annotation Attributes

    Fluent Mapping

    【讨论】:

      【解决方案2】:

      RangeAttribute 不控制数据库中的值范围。它将列创建为 int 列,接受 int 类型可以接受的所有整数。如果您创建设置此列值的存储过程,则不会针对此范围进行验证。如果实体框架在列上创建约束会很好,但这不会发生。

      RangeAttribute 会在将您的实体保存在数据存储中之前验证您的数据。

      【讨论】:

      • 谢谢你很好地解释了我的问题。好的,但是现在如果我像这样使用数据注释:[MaxLength(10),MinLength(5)] public string BloggerName { get; set; } 那么会同时进行验证和持久性验证吗?
      • 同样,这只会在您插入或更新实体之前验证您的数据。在 ASP.NET 脚手架的情况下,将使用相同的数据注释在页面级别验证数据。
      猜你喜欢
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多