如何使用实体框架控制数据库参数

Posted

技术标签:

【中文标题】如何使用实体框架控制数据库参数【英文标题】: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 在创建条目时提供的功能。

【问题讨论】:

【参考方案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 脚手架的情况下,将使用相同的数据注释在页面级别验证数据。

以上是关于如何使用实体框架控制数据库参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用实体框架或 MVC 项目绑定 HTML 选择元素?

您如何将乐观并发与 WebAPI OData 控制器一起使用

WCF 数据服务或实体框架

如何实现 IDbContextFactory 以用于实体框架数据迁移

如何使用实体框架连接三个表来获取所有数据

如何从使用实体框架的外键链接的多个表中获取所有数据?