0

我们有一个带有多个表的 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,但年龄将设置为空 - 而不是我的默认值 18。

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

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

谢谢,

4

1 回答 1

0

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

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

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

于 2013-01-18T22:01:11.607 回答