是否可以在EF Code First方法中为实体模型对象的属性设置器覆盖或添加代码。
e.g。
public class Contact
{
[Key]
public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string JobTitle
{
get;
set { // eg. proper case the job title }
}
}
我曾尝试将公共属性标记为NotMapped,并设置/获取私有/受保护属性。但似乎该财产必须公开才能在表格中创建。
答案 0 :(得分:11)
如果需要,您可以在那里编写逻辑,只需将属性转换为非自动属性,然后像对普通属性一样执行检查。
private string jobTitle;
public string JobTitle
{
get { return jobTitle; }
set
{
// do your fancy stuff or just jobTitle = value
}
}
请记住,如果您在setter中更改了db中的值,那么在您对上下文执行SaveChanges()
之后,它可能会稍后保存。
答案 1 :(得分:1)
您可以使用ModelBuilder
和.Ignore(...)
.Ignore(...)从模型中排除属性,使其不会映射到数据库。
public class MyDbContext : DbContext
{
public DbSet<Contact> Contact { get; set; }
// other DbSet's
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Contact>().Ignore(x => x.JobTitle);
}
}
答案 2 :(得分:1)
我做了一些略有不同的事情。 在您的示例中,我将更改映射文件,以便映射到数据库的属性上的getter和setter为私有和小写,就像dmusial所示。然后我创建了一个未映射到edmx文件中的属性,如此处所示(注意:虽然我通常会创建成员字段_jobTitle,但我使用代码生成并且在EF 5.x中不允许以_开头)。
///<summary>
/// Private member mapped in .edmx file
/// Something like:
/// <Property Name="jobTitle" Type="String" MaxLength="Max" FixedLength="false"
/// a:SetterAccess="Private" a:GetterAccess="Private"
/// xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration" />
///</summary>
private string jobTitle { get; set; }
///<summary>
/// Publicly visible property that now contains your logic.
///</summary>
public string JobTitle
{
get { return jobTitle; }
set { jobTitle = SetProperCase(value); }
}
现在调用SaveChanges时,它应该将jobTitle属性保存到它在edmx文件中映射到的列中。