如何让EF将SQL Server列识别为Computed?

时间:2016-05-27 07:49:45

标签: c# sql-server entity-framework timestamp

我首先使用数据库。

我希望创建一个列,用于存储记录的LastModified日期时间。此列应默认为GetUTCDate(),修改行时,设置为GetUTCDate()

我可以使用桌面上的触发器来执行后者。

但是,在使用Entity Framework插入记录时,默认情况下它会在LastModified列中发送0日期,然后忽略该列的默认约束,并将该值设置为0。

我可以手动更改.edmx文件中列的StoreGeneratedPattern属性。但是我希望实体框架能够自动执行此操作 - 如果这样做,那么我依靠内存来实现它。

有没有办法在SQL Server中配置列,以便Entity框架在插入记录时永远不会发送值(我相信这可以使用计算列实现)?

2 个答案:

答案 0 :(得分:1)

数据库第一种情况:计算列是只读数据,您必须知道您不能在此列中写入,就像您必须知道要在数据库的每一列中写入哪些数据一样。

代码第一种情况: 这里是代码第一个对象中计算列的示例 请注意注释DatabaseGeneratedOption.Computed

public class UserProfile
{
     public int Id { get; set; }

     public string FirstName { get; set; }
     public string LastName { get; set; }

     [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
     public string FullName { get; private set; }
}

FullName属性需要DatabaseGenerated属性。这是一个让Entity Framework Code First知道数据库将为我们计算这个属性的提示。

答案 1 :(得分:1)

您的EDMX只是一个XML文件。您可以创建一些简单的控制台应用程序,例如EDMXFixer.exe,您可以在构建事件上运行并编辑文件。我们在所有表中都有一些常用列CreatedDate,默认值为getdate()。所以我只是编辑EDMX文件并将所有列都设为StoreGeneratedPattern = Computed

然后我在我的预制活动中有这个:

"$(ProjectDir)EDMXFixer.exe" "$(ProjectDir)DatabaseObjects\test.edmx"

修复程序代码如下所示:

static void Main(string[] args)
{
    int i;
    int count;

    XmlAttribute xmlAttribute;

    if ((args == null ? false : (int)args.Length != 0))
    {
        string str = args[0];
        bool flag = false;

        if (File.Exists(str))
        {
            FileInfo fileInfo = new FileInfo(str);
            if ((fileInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                fileInfo.Attributes = (FileAttributes)(Convert.ToInt32(fileInfo.Attributes) - Convert.ToInt32(FileAttributes.ReadOnly));
                flag = true;
            }

            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(str);

            if (xmlDocument.DocumentElement != null)
            {
                count = xmlDocument.DocumentElement.ChildNodes[1].ChildNodes[1].ChildNodes[0].ChildNodes.Count;
                for (i = 0; i < count; i++)
                {
                    if (xmlDocument.DocumentElement != null)
                    {
                        foreach (XmlNode childNode in xmlDocument.DocumentElement.ChildNodes[1].ChildNodes[1].ChildNodes[0].ChildNodes[i].ChildNodes)
                        {
                            if ((childNode.Name != "Property" ? false : childNode.Attributes != null))
                            {
                                if ((childNode.Attributes["Name"].Value != "CreatedDate" ? false : childNode.Attributes["Type"].Value == "datetime"))
                                {
                                    xmlAttribute = xmlDocument.CreateAttribute("StoreGeneratedPattern");
                                    xmlAttribute.Value = "Computed";
                                    childNode.Attributes.Append(xmlAttribute);
                                }
                            }
                        }
                    }
                }
            }
            if (xmlDocument.DocumentElement != null)
            {
                count = xmlDocument.DocumentElement.ChildNodes[1].ChildNodes[3].ChildNodes[0].ChildNodes.Count;
                for (i = 0; i < count; i++)
                {
                    if (xmlDocument.DocumentElement != null)
                    {
                        foreach (XmlNode xmlNodes in xmlDocument.DocumentElement.ChildNodes[1].ChildNodes[3].ChildNodes[0].ChildNodes[i].ChildNodes)
                        {
                            if ((xmlNodes.Name != "Property" ? false : xmlNodes.Attributes != null))
                            {
                                if ((xmlNodes.Attributes["Name"].Value != "CreatedDate" ? false : xmlNodes.Attributes["Type"].Value == "DateTime"))
                                {
                                    xmlAttribute = xmlDocument.CreateAttribute("annotation", "StoreGeneratedPattern", "http://schemas.microsoft.com/ado/2009/02/edm/annotation");
                                    xmlAttribute.Value = "Computed";
                                    xmlNodes.Attributes.Append(xmlAttribute);
                                }
                            }
                        }
                    }
                }
            }
            xmlDocument.Save(str);
            if (flag)
            {
                fileInfo.Attributes = (FileAttributes)(Convert.ToInt32(fileInfo.Attributes) + Convert.ToInt32(FileAttributes.ReadOnly));
            }
        }
    }
}

您只需根据需要稍微更改一下。