在DB中创建条目会使传递的变量重复,而不是FK

时间:2014-08-29 15:13:19

标签: c# database entity-framework-4 dbcontext

所以,我试图在我的数据库中创建一个新行(使用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
});

但发生的事情是每次执行时都会创建一个新的主题和新教师,并创建相同的名称。

Bert is now duplicated

此外,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();
        }
    }
...

2 个答案:

答案 0 :(得分:1)

您需要首先附加引用的方法。从tutorRepsubjectRep返回的实体不再是代理,它是一个断开连接的对象。 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,SubjectIdCourse,则可以指定它。

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,并且完成了诡计。