如何使用实体框架控制数据库参数
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-CodeFirst
的StorageModel
。我能想到的两种方法是Attribute
和Fluent-Registration
。
Data Annotation Attributes
Fluent Mapping
【讨论】:
【参考方案2】:RangeAttribute
不控制数据库中的值范围。它将列创建为 int 列,接受 int 类型可以接受的所有整数。如果您创建设置此列值的存储过程,则不会针对此范围进行验证。如果实体框架在列上创建约束会很好,但这不会发生。
RangeAttribute
会在将您的实体保存在数据存储中之前验证您的数据。
【讨论】:
谢谢你很好地解释了我的问题。好的,但是现在如果我像这样使用数据注释:[MaxLength(10),MinLength(5)] public string BloggerName get; set;
那么会同时进行验证和持久性验证吗?
同样,这只会在您插入或更新实体之前验证您的数据。在 ASP.NET 脚手架的情况下,将使用相同的数据注释在页面级别验证数据。以上是关于如何使用实体框架控制数据库参数的主要内容,如果未能解决你的问题,请参考以下文章
您如何将乐观并发与 WebAPI OData 控制器一起使用