我想知道是否可以在使用Entity Framework Code First方法的模型类上添加特定于域的方法。
例如,以下虚拟方法:
public class Student
{
public Student()
{
}
public int StudentID { get; set; }
public string StudentName { get; set; }
// Dummy method
public string StudentNamePlusALetter(string letter)
{
return (this.StudentName + letter)
}
}
如果不可能,我应该在哪里添加它们?
提前谢谢。
答案 0 :(得分:3)
当然,有一点需要注意,StudentNamePlusALetter()
的值不会存储在您的数据库中(因为只有属性在那里被序列化)。
答案 1 :(得分:3)
我通常通过2个“部分”类来做到这一点。一个用于直接映射的数据库属性。一个额外的东西。
在名为Employee.cs的文件中
public partial class Employee
{
public Employee()
{
}
public System.Guid EmployeeUUID { get; set; }
public string SSN { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public System.DateTime ? CreateDate { get; set; }
public System.DateTime HireDate { get; set; }
}
然后在名为EmployeeExtended.cs的文件中
public partial class Employee
{
public string EmployeeFullName
{
get
{
return string.Format("{0}, {1} ('{2}')", this.LastName, this.FirstName, this.SSN);
}
}
}
请注意,上面有一个readonly(“get”)属性(“EmployeeFullName”),可以在EF中正常工作,不需要进行任何更改。
我也可以这样做:
public partial class Employee
{
public string EmployeeFullName
{
get
{
return string.Format("{0}, {1} ('{2}')", this.LastName, this.FirstName, this.SSN);
}
}
public string SomeNonTrackedDatabaseProperty { get; set; }
}
但是我必须在Mapping中为“SomeNonTrackedDatabaseProperty”添加一个“.Ignore”,因为它不是数据库中的列。
public class EmployeeMap : EntityTypeConfiguration<Employee>
{
public EmployeeMap()
{
// Primary Key
this.HasKey(t => t.EmployeeUUID);
this.Property(t => t.SSN)
.IsRequired()
.HasMaxLength(11);
this.Property(t => t.LastName)
.IsRequired()
.HasMaxLength(64);
this.Property(t => t.FirstName)
.IsRequired()
.HasMaxLength(64);
// Table & Column Mappings
this.ToTable("Employee");
this.Property(t => t.EmployeeUUID).HasColumnName("EmployeeUUID");
this.Property(t => t.SSN).HasColumnName("SSN");
this.Property(t => t.LastName).HasColumnName("LastName");
this.Property(t => t.FirstName).HasColumnName("FirstName");
this.Property(t => t.CreateDate).HasColumnName("CreateDate");
this.Property(t => t.HireDate).HasColumnName("HireDate");
this.Ignore(t => t.SomeNonTrackedDatabaseProperty);
}
}
}
答案 2 :(得分:1)
扩展方法在这里也不是坏主意。