gpt4 book ai didi

c# - 在数据库中创建条目会复制传递的变量而不是 FK

转载 作者:搜寻专家 更新时间:2023-10-30 20:39:38 25 4
gpt4 key购买 nike

所以,我尝试在我的数据库中创建一个新行(使用 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 和新的同名 Teacher。

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

最佳答案

您首先需要一种附加引用的方法。从 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();

或者,如果您在 Course 上有 FK id、TutorIdSubjectId,您可以直接分配它。

courseRep.Create(new Course {
Date = DateTime.Parse(date),
TutorId = tutorId,
SubjectId = subjectId
});

关于c# - 在数据库中创建条目会复制传递的变量而不是 FK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25571209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com