如何在EFCore中覆盖实体保存?

时间:2018-09-18 18:56:43

标签: c# entity-framework-core

我想在模型中存储对象列表,但是我知道EFCore不支持该列表。要解决此问题,我在模型上创建了一个私有字符串属性,以保存列表中对象的ID。我的意图是在还原类时在类的构造函数中填充列表。我的课程如下:

public class Visitor
{
    public int ID { get; set; }

    private string _DepartmentIds { get; set; }

    public List<Department> Departments { get; set; }

    public Visitor()
    {
        if (_DepartmentIds.Length > 0)
        {
            Departments = JsonConvert.DeserializeObject<List<Department>>(_DepartmentIds);
        }
        else
        {
            Departments = new List<Department>();
        }
    }
}

我有两个问题。一种是_DepartmentIds不会被EFCore保存/跟踪。我想是因为它是私有的。第二个是我需要创建一个将从部门列表中读取ID的方法,以将它们放入_DepartmentIds字符串中,但是我不知道如何在对象保存时调用此方法。是否可以覆盖或扩展保存在EFCore中的实体模型?

编辑:我使用的是反序列化,而不是仅使用分隔符将ID串联起来,因为我以后可能想扩展它。

1 个答案:

答案 0 :(得分:0)

对于一个:许多关系,您应该创建一个单独的表并将其联接。模式应类似于:

public class Visitor {
    public int ID { get; set; }
    public List<Department> Departments { get; set; }
}

public class Department {
    public int ID { get; set; }
    public int VisitorID { get; set; }

    [ForeignKey(nameof(VisitorID))]
    public Visitor Visitor { get; set; }
}

如果您不想在Visitor中使用Department对象,也可以使用以下类似方法通过fluent API对其进行配置:

entity.HasOne<Visitor>()
    .WithMany()
    .HasForeignKey(department => department.VisitorID);

Visitor上执行查找时,您将可以使用Include函数来包括所有相关部门。