【发布时间】:2016-02-14 16:51:40
【问题描述】:
我的应用中有以下模型:
public interface IBaseEntityObject
{
public int Id {get; set;}
}
public abstract class BaseEntityObject : IBaseEntityObject
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get; set;}
}
public class Folder : BaseEntityObject
{
[DataMember]
public string Name {get; set;}
[DataMember]
public virtual List<Letter> Letters {get; set;}
}
public abstract class Letter : BaseEntityObject
{
[DataMember]
public string Title {get; set;}
[DataMember]
public string Content {get; set;}
public virtual Folder Folder {get; set;}
[DataMember]
public int FolderId {get; set;}
[DataMember]
public DateTime CreationDate {get; set;}
}
public class OutgoingLetter : Letter
{
// .. OutgoingLetter properties
}
public class ReceviedLetter : Letter
{
// .. ReceviedLetter properties
}
public class MyDbContext : DbContext
{
public DbSet<Folder> Folders {get; set;}
public DbSet<Letter> Letters {get; set;}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Folder <-> Letters
modelBuilder.Entity<Letter>()
.HasRequired(t => t.Folder)
.WithMany(f => f.Letters)
.HasForeignKey(t => t.FolderId)
.WillCascadeOnDelete(true);
}
}
但是,无论我如何尝试,删除文件夹都会导致访问密钥违规。
在那之后,我尝试在删除之前删除文件夹中的所有字母(我不喜欢) 它导致了另一个异常 - 不可为空成员的 Null 值。
我删除文件夹的正确和最有效的方法是什么?
编辑:
我尝试删除文件夹的代码:
public abstract class EFRepository<T> : IRepository<T>
{
protected readonly DbContext Context;
public EFRepository(DbContext context)
{
Context = context;
}
public abstract List<T> Get();
public void Add(T item)
{
Context.Set<T>().Add(item);
}
public virtual Remove(T item)
{
Context.Set<T>().Remove(item);
}
public void Update(T item)
{
Context.Entry(item).State = EntityState.Modified;
}
public void Dispose()
{
Context.Dispose();
}
public int SaveChanges()
{
return Context.SaveChanges();
}
public T FindById(int id)
{
return Context.Set<T>().Find(id);
}
}
public FoldersRepository : EFRepository<Folder>
{
public FoldersRepository(DbContext context) : base(context) {}
public void override Remove(Folder folder)
{
var letters = folder.Letters;
for (int index = 0 ; index < letters.Count; index++)
{
Context.Set<Letter>().Remove(letters[0]);
}
base.Remove(folder);
}
}
这个问题有解决办法吗? 还是找不到
【问题讨论】:
-
删除“文件夹”时,是否首先删除与该“文件夹”关联的每个“字母”?
-
起初我尝试不删除它(如果可能的话,我会非常喜欢)之后,我尝试在删除之前删除文件夹中的所有字母(我不喜欢),结果在另一个例外中 - 不可为空的成员的 Null 值。
-
请发布您用于删除的代码以及您得到的确切异常
-
如果每个 Letter 行都有一个外键指向 Folder 行,只要还有 Letter 指向它,您就无法删除该 Folder 行。
-
EF 模型看起来不错。 WillCascadeOnDelete(true) 应该可以完成这项工作。您能否显示代码如何删除文件夹?
标签: c# entity-framework ef-code-first entity-framework-6