我首先使用数据库。
我希望创建一个列,用于存储记录的LastModified
日期时间。此列应默认为GetUTCDate()
,修改行时,设置为GetUTCDate()
。
我可以使用桌面上的触发器来执行后者。
但是,在使用Entity Framework插入记录时,默认情况下它会在LastModified
列中发送0日期,然后忽略该列的默认约束,并将该值设置为0。
我可以手动更改.edmx文件中列的StoreGeneratedPattern属性。但是我希望实体框架能够自动执行此操作 - 如果这样做,那么我依靠内存来实现它。
有没有办法在SQL Server中配置列,以便Entity框架在插入记录时永远不会发送值(我相信这可以使用计算列实现)?
答案 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));
}
}
}
}
您只需根据需要稍微更改一下。