我正在使用EF代码优先与数据库优先的方法。"with Database.SetInitializer(null);“
我的表有两列createddate和amendddate。它们由SQL Server使用触发器进行管理。这个想法是,当数据输入发生时,这些列通过触发器获取数据。
现在我想要做的是,从EF Code first的角度来读这个。也就是说,我希望能够从我的应用程序中看到创建日期和取消日期,但我不想修改这些数据。
我已经尝试在setter上使用私有修饰符,但是没有luck.When,我尝试向表中添加新数据,它试图向数据库输入DateTime.Max date,这会从SQL server抛出错误。
有什么想法吗?
发布于 2011-07-03 19:01:03
您不能使用私有修饰符,因为EF本身在加载实体时需要设置您的属性,而Code First只有在属性具有公共setter时才能这样做(与EDMX相反,在EDMX中,私有setter可以是(1)、(2))。
你需要做的是用DatabaseGeneratedOption.Identity
标记你的CreatedDate
,用DatabaseGeneratedOption.Computed
标记你的AmendDate
。这将允许EF正确地从数据库加载数据,在insert或update之后重新加载数据,以便实体在您的应用程序中是最新的,同时它不允许您更改应用程序中的值,因为应用程序中设置的值永远不会传递到数据库。从面向对象的角度来看,这不是一个非常好的解决方案,但从功能的角度来看,它正是您想要的。
您可以使用数据注释来完成此操作:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedDate { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime AmendDate { get; set; }
或者在派生的上下文中使用OnModelCreating
override中的fluent API:
modelBuilder.Entity<YourEntity>()
.Property(e => e.CreatedDate)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<YourEntity>()
.Property(e => e.AmendDate)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
发布于 2018-08-10 11:22:14
EF核心1.1或更高版本是的,您可以在poco类中使用只读属性。你需要做的就是使用后场。
public class Blog
{
private string _validatedUrl;
public int BlogId { get; set; }
public string Url
{
get { return _validatedUrl; }
}
public void SetUrl(string url)
{
using (var client = new HttpClient())
{
var response = client.GetAsync(url).Result;
response.EnsureSuccessStatusCode();
}
_validatedUrl = url;
}
}
类MyContext : DbContext {公共DbSet博客{ get;set;}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Url)
.HasField("_validatedUrl");
}
}
和流畅的api。
modelBuilder.Entity<Blog>()
.Property(b => b.Url)
.HasField("_validatedUrl")
.UsePropertyAccessMode(PropertyAccessMode.Field);
https://stackoverflow.com/questions/6564772
复制相似问题