所以,我试图在我的数据库中创建一个新行(使用EF4.0 Code-First)
courseRep.Create(new Course {
Date = DateTime.Parse(date),
Tutor = tutorRep.GetById(tutorId), // I get the correct Tutor
Subject = subjectRep.GetById(subjectId) // and the correct Subject
});
但发生的事情是每次执行时都会创建一个新的主题和新教师,并创建相同的名称。
此外,Subject-Tutor是n:n,但在创建的关联表SubjectTutors中不会有条目。
任何提示?
编辑:RepositoryBase
的开头如下:
public class RepositoryBase<TEntity, TContext> : IRepository<TEntity>
where TEntity : class
where TContext : DbContext, new()
{
public void Create(TEntity o)
{
using (TContext db = new TContext())
{
db.Set<TEntity>().Add(o);
db.SaveChanges();
}
}
...
答案 0 :(得分:1)
您需要首先附加引用的方法。从tutorRep
和subjectRep
返回的实体不再是代理,它是一个断开连接的对象。 EF不知道它是一个现有的实体,EF只会将图中的所有对象标记为已添加。
您需要首先附加引用的方法。
db.Entry(o.Tutor).State = EntityState.Unchanged;
db.Entry(o.Subject).State = EntityState.Unchanged;
可能会重构create方法,你可以反思它你有一个基类。
public class TEntity : BaseEntity
{
}
var references = o.GetType()
.GetProperties()
.Where(p => p.PropertyType.BaseType == typeof(BaseEntity))
.Select(p => p.GetValue(o))
.Where(t => t != null)
.ToArray();
foreach (var reference in references)
{
db.Entry(reference).State = EntityState.Unchanged;
}
db.Set<TEntity>().Add(o);
db.SaveChanges();
或者,如果您在TutorId
上拥有FK ID,SubjectId
和Course
,则可以指定它。
courseRep.Create(new Course {
Date = DateTime.Parse(date),
TutorId = tutorId,
SubjectId = subjectId
});
答案 1 :(得分:0)
其他解决方案可能是正确的,但我找到了一个非常简单的解决方案,在我的案例中对我有用:
courseRep.Create(new Course {
Date = DateTime.Parse(date),
TutorId = tutorId, // instead of Tutor = ...
SubjectId = subjectId // instead of Subject = ...
});
我没有传递导师和主题的引用,而是传递了Id,并且完成了诡计。