代码优先自引用外键(多个)
Code first self referencing foreign key (more than one)
我有一个用户实体,它的父实体是 EntityBase class。
父 class 看起来像这样:
public class EntityBase
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public bool? IsPublic { get; set; }
public bool? IsActive { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; }
public DateTime? DeletedAt { get; set; }
public virtual User CreatedBy { get; set; }
public Guid? CreatedById { get; set; }
public virtual User UpdatedBy { get; set; }
public Guid? UpdatedById { get; set; }
public virtual User DeletedBy { get; set; }
public Guid? DeletedById { get; set; }
}
用户class:
public class User : EntityBase
{
public string Username { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string Token { get; set; }
public DateTime LastLogin { get; set; }
public DateTime LastAction { get; set; }
public bool IsLocked { get; set; }
public bool IsAdmin { get; set; }
public virtual ICollection<Cocktail> Cocktails { get; set; }
public virtual ICollection<Drink> DrinkVotes { get; set; }
public virtual ICollection<Cocktail> CocktailVotes { get; set; }
}
现在我的自引用有问题,因为存在循环依赖,我该如何解决这个问题?
1) 你的基础实体必须是抽象的
public abstract class EntityBase ....
2) 移动 child 类 中的 Id 例如 UserId/CoktailId 等(可选但推荐)
4) 使用 InverseProperty 属性引用鸡尾酒
示例:http://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx
在您的上下文中,您需要重写 OnModelCreating(DbModelBuilder),然后像这样设置关系:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasOptional(f => f.CreatedBy)
.WithMany()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(f => f.UpdatedBy)
.WithMany()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(f => f.DeletedBy)
.WithMany()
.WillCascadeOnDelete(false);
}
您正在通过
删除此处的循环引用
- 声明 CreatedBy、UpdatedBy 和 DeletedBy 关系是可选的
- 删除时禁用级联
我有一个用户实体,它的父实体是 EntityBase class。 父 class 看起来像这样:
public class EntityBase
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public bool? IsPublic { get; set; }
public bool? IsActive { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; }
public DateTime? DeletedAt { get; set; }
public virtual User CreatedBy { get; set; }
public Guid? CreatedById { get; set; }
public virtual User UpdatedBy { get; set; }
public Guid? UpdatedById { get; set; }
public virtual User DeletedBy { get; set; }
public Guid? DeletedById { get; set; }
}
用户class:
public class User : EntityBase
{
public string Username { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string Token { get; set; }
public DateTime LastLogin { get; set; }
public DateTime LastAction { get; set; }
public bool IsLocked { get; set; }
public bool IsAdmin { get; set; }
public virtual ICollection<Cocktail> Cocktails { get; set; }
public virtual ICollection<Drink> DrinkVotes { get; set; }
public virtual ICollection<Cocktail> CocktailVotes { get; set; }
}
现在我的自引用有问题,因为存在循环依赖,我该如何解决这个问题?
1) 你的基础实体必须是抽象的
public abstract class EntityBase ....
2) 移动 child 类 中的 Id 例如 UserId/CoktailId 等(可选但推荐)
4) 使用 InverseProperty 属性引用鸡尾酒 示例:http://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx
在您的上下文中,您需要重写 OnModelCreating(DbModelBuilder),然后像这样设置关系:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasOptional(f => f.CreatedBy)
.WithMany()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(f => f.UpdatedBy)
.WithMany()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(f => f.DeletedBy)
.WithMany()
.WillCascadeOnDelete(false);
}
您正在通过
删除此处的循环引用- 声明 CreatedBy、UpdatedBy 和 DeletedBy 关系是可选的
- 删除时禁用级联