【问题标题】:Entity Framework Core: How to configure model with two One to Many relations in one entity referencing the same tableEntity Framework Core:如何在一个引用同一个表的实体中配置具有两个一对多关系的模型
【发布时间】:2016-06-27 14:41:39
【问题描述】:

我想跟踪谁创建了实体,以及谁编辑了(最后)实体。由于我想对项目中的每个实体执行此操作,因此我在一个名为 EntityBase 的基类中执行此操作。

如果我取消注释 EntityBase 类中具有相应 ForeignKey 属性的 EditorUser,则 Context.Database.EnsureCreated 方法将引发以下异常:

无效操作异常: 附加信息:无法确定在“User.CreatorUser”和“User”之间检测到的一对一关系的子/依赖方。要识别关系的子/依赖方,请配置外键属性。

谁能帮我配置模型来满足我的要求?

public class EntityBase
{
    public Guid Id { get; set; }
    public Guid CreatorUserId { get; set; }
    [ForeignKey(nameof(CreatorUserId))]
    public User CreatorUser { get; set; }
    public Guid? EditorUserId { get; set; }
    //[ForeignKey(nameof(EditorUserId))]
    //public User EditorUser { get; set; }
}
public class User : EntityBase
{
    public String Name { get; set; }
}
public class House : EntityBase
{
    public String Address { get; set; }
}
class Context : DbContext
{
    public Guid CurrentUserId = new Guid("3de85c1f-3ce1-4342-a582-83d6cc8e308f");

    public DbSet<User> Users { get; set; }
    public DbSet<House> Houses { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite(@"Data Source = c:\Temp\eftest.db;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
        {
            relationship.DeleteBehavior = DeleteBehavior.Restrict;
        }
        base.OnModelCreating(modelBuilder);
    }

    public override int SaveChanges()
    {
        var changeSet = ChangeTracker.Entries<EntityBase>();
        if (changeSet != null)
        {
            foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
            {
                switch (entry.State)
                {
                    case EntityState.Added:
                        entry.Entity.CreatorUserId = CurrentUserId;
                        break;
                    default:
                        entry.Entity.EditorUserId = CurrentUserId;
                        break;
                }
            }
        }
        return base.SaveChanges();
    }
}

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    好吧,基本上你在EntityBase 中的CreatorUser 是从User 派生的,它使用EntityBase 作为基础。所以这有点像鸡和蛋的问题。 您可以为 Parent 创建另一个用户实体并将其添加到 EntityBase 可能。

    【讨论】:

    • 就是这样。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多