Entity Framework Code First 方法类中的业务逻辑类型方法

7 c# asp.net entity-framework ef-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)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果不可能,我应该在哪里添加它们?

先感谢您。

gra*_*der 5

我通常通过两门“部分”课程来做到这一点。一种用于直接映射的数据库属性。一个用于额外的东西。

在名为 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; }

}
Run Code Online (Sandbox Code Playgroud)

然后在一个名为 EmployeeExtended.cs 的文件中

public partial class Employee
{
    public string EmployeeFullName
    {
        get
        {
            return string.Format("{0}, {1} ('{2}')", this.LastName, this.FirstName, this.SSN);
        }
    }


}
Run Code Online (Sandbox Code Playgroud)

请注意,在上面,我有一个只读(“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; }

}
Run Code Online (Sandbox Code Playgroud)

但随后我必须在“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);


        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您想最小化配置代码,您还可以使用 [NotMapped] 属性来装饰 EmployeeExtended.cs 中的属性。 (2认同)

48k*_*ocs 4

当然是这样,但需要注意的是, 的值StudentNamePlusALetter()不会存储在数据库中(因为只有属性在那里被序列化)。