Sam*_*Sam 29 c# entity-framework ef-code-first entity-framework-5
当我试图清除一个集合(调用.Clear)时,我得到以下异常:
保存不公开其关系的外键属性的实体时发生错误.EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源.通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常.有关详细信息,请参阅InnerException.
内在的例外是:
来自'User_Availability'AssociationSet的关系处于'已删除'状态.给定多重约束,相应的'User_Availability_Target'也必须处于'已删除'状态.
用户看起来像这样:
....
ICollection<Availability> Availability { get; set; }
Run Code Online (Sandbox Code Playgroud)
可用性如下所示:
int ID { get; set; }
User User { get; set; }
DateTime Start { get; set;
DateTime End { get; set; }
Run Code Online (Sandbox Code Playgroud)
配置如下:
HasMany(x => x.Availability).WithRequired(x => x.User);
HasRequired(x => x.User).WithMany(x => x.Availability);
Run Code Online (Sandbox Code Playgroud)
导致问题的代码是:
user.Availability.Clear();
Run Code Online (Sandbox Code Playgroud)
我已经看过其他替代方法,比如使用DbSet删除项目,但我觉得我的代码不会那么干净.有没有办法通过清除集合来实现这一目标?
Sla*_*uma 31
我意识到使其发挥作用的唯一方法是将关系定义为识别关系.这将需要从引进国外关键Availability,以User作为外键到模型中...
public int ID { get; set; }
public int UserID { get; set; }
public User User { get; set; }
Run Code Online (Sandbox Code Playgroud)
...并使其成为主键的一部分:
modelBuilder.Entity<Availability>()
.HasKey(a => new { a.ID, a.UserID });
Run Code Online (Sandbox Code Playgroud)
您可以扩展映射以包含此外键(只是为了显式,它不是必需的,因为EF会按惯例识别它):
modelBuilder.Entity<Availability>()
.HasRequired(a => a.User)
.WithMany(u => u.Availability)
.HasForeignKey(a => a.UserID);
Run Code Online (Sandbox Code Playgroud)
(顺便说一句:您只需要从一侧配置关系.在您的问题中不需要同时具有这两种映射.)
现在,您可以清除收集user.Availability.Clear();和Availability实体将被从数据库中删除.
| 归档时间: |
|
| 查看次数: |
15933 次 |
| 最近记录: |