首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >EF代码第一个只读列

EF代码第一个只读列
EN

Stack Overflow用户
提问于 2011-07-04 02:34:51
回答 2查看 20.8K关注 0票数 26

我正在使用EF代码优先与数据库优先的方法。"with Database.SetInitializer(null);“

我的表有两列createddate和amendddate。它们由SQL Server使用触发器进行管理。这个想法是,当数据输入发生时,这些列通过触发器获取数据。

现在我想要做的是,从EF Code first的角度来读这个。也就是说,我希望能够从我的应用程序中看到创建日期和取消日期,但我不想修改这些数据。

我已经尝试在setter上使用私有修饰符,但是没有luck.When,我尝试向表中添加新数据,它试图向数据库输入DateTime.Max date,这会从SQL server抛出错误。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-04 03:01:03

您不能使用私有修饰符,因为EF本身在加载实体时需要设置您的属性,而Code First只有在属性具有公共setter时才能这样做(与EDMX相反,在EDMX中,私有setter可以是(1)(2))。

你需要做的是用DatabaseGeneratedOption.Identity标记你的CreatedDate,用DatabaseGeneratedOption.Computed标记你的AmendDate。这将允许EF正确地从数据库加载数据,在insert或update之后重新加载数据,以便实体在您的应用程序中是最新的,同时它不允许您更改应用程序中的值,因为应用程序中设置的值永远不会传递到数据库。从面向对象的角度来看,这不是一个非常好的解决方案,但从功能的角度来看,它正是您想要的。

您可以使用数据注释来完成此操作:

代码语言:javascript
代码运行次数:0
运行
复制
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedDate { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime AmendDate { get; set; }

或者在派生的上下文中使用OnModelCreating override中的fluent API:

代码语言:javascript
代码运行次数:0
运行
复制
modelBuilder.Entity<YourEntity>() 
            .Property(e => e.CreatedDate)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<YourEntity>()
            .Property(e => e.AmendDate)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
票数 40
EN

Stack Overflow用户

发布于 2018-08-10 19:22:14

EF核心1.1或更高版本是的,您可以在poco类中使用只读属性。你需要做的就是使用后场。

代码语言:javascript
代码运行次数:0
运行
复制
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;}

代码语言:javascript
代码运行次数:0
运行
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .HasField("_validatedUrl");
}

}

和流畅的api。

代码语言:javascript
代码运行次数:0
运行
复制
modelBuilder.Entity<Blog>()
    .Property(b => b.Url)
    .HasField("_validatedUrl")
    .UsePropertyAccessMode(PropertyAccessMode.Field);

Take a look here..

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6564772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档