实体框架和 SQL Server 表属性

Posted

技术标签:

【中文标题】实体框架和 SQL Server 表属性【英文标题】:Entity Framework and SQL Server table properties 【发布时间】:2013-01-18 10:53:20 【问题描述】:

我们有一个包含多个表的 SQL Server 2008 R2 数据库,每个表都有多个触发器。在其中一列中,我们将调用此 Person.Age 我们有一个默认值,因此如果我没有明确提供一个值,它默认为“18”。

    create table PERSON
(
id                              int             IDENTITY(1,1) PRIMARY KEY,
age                             char(2)         DEFAULT '18',
Name                            char(40),   
);

我正在使用 EntityFramework 4.0(也尝试过 5.0)和 Visual Studio 2010 来加载和从数据库中选择。每当我使用以下语句插入表时,它都会插入一行,但它没有完成默认值:

var person = new Person

   Name = "Peter"
;

using (var ctx = new MyEntities())
            
                ctx.PERSON.AddObject(person);
                ctx.SaveChanges();
            

这将导致一行名称为 Peter,但年龄将设置为 null - 而不是我的默认值 18。

当我刷新/加载我的 EDMX 文件时,我似乎只能导入简单的表和视图,并且似乎没有用于导入属性的选项 - 尽管我会认为这是默认完成的?任何想法为什么默认属性没有触发?

另外,我在 SQL Server 中定义了触发器,因此当将新行插入 PERSON 时,会更新另一个表。如果我直接对数据库运行 SQL,这同样有效,但如果我使用 EntityFramework 通过 Visual Studio 执行则不起作用。

谢谢,

【问题讨论】:

【参考方案1】:

EF 会将列显式设置为您传递的值。因为,当您创建 Person 实体时,age 的值将默认设置为 null EF 将发送一条命令,在该命令中将列值设置为 null。如果您想拥有默认值,请在 ctor 中设置默认值(否则,对于引用属性,默认值为 null,对于值类型属性(例如 int),默认值是 default(T))。

EF 设计器从数据库中获取所有列,并创建一个模型,该模型的实体具有与它反向工程的表和列的值相对应的属性。然后,您可以在设计器中调整模型 - 例如,您可以删除不需要的属性。

我不知道在触发器的情况下“不起作用”对您意味着什么 - 这可能取决于您的期望。 EF 只是向数据库发送一个命令。因此,如果您发送与 EF 发送相同的 Sql 命令,它应该以相同的方式“不起作用”。话虽如此,EF 与数据库无关,并且不知道触发器之类的数据库魔术。此外,通信只是从 EF 到 DB 的一种方式。因此,如果您希望数据库通知 EF 某事,那么它将无法正常工作。没有办法做到这一点。

【讨论】:

以上是关于实体框架和 SQL Server 表属性的主要内容,如果未能解决你的问题,请参考以下文章

Net Core:实体框架和 SQL Server 时态表、自动脚手架

SQL Server 和实体框架性能改进

实体框架将 DateTimeOffset 映射到 SQL Server DateTime

将数据库移动到新服务器后,无法在 Visual Studio 2010 的实体框架设计器中看到 SQL Server 2008 表

如何在 SQL Server 或实体框架中创建没有主键的一对多关系?

实体框架和 SQL Server 视图