Entity framework 实体框架很多很多
因此,我的工作和个人模型如下:Entity framework 实体框架很多很多,entity-framework,Entity Framework,因此,我的工作和个人模型如下: public class Work{ public int ID public string Name public virtual ICollection<Person> CurrentWorkers public virtual ICollection<Person> ProjectOwners } public class Person{ public int ID public string UserID
public class Work{
public int ID
public string Name
public virtual ICollection<Person> CurrentWorkers
public virtual ICollection<Person> ProjectOwners
}
public class Person{
public int ID
public string UserID
public virtual ICollection<Work> CurrentWork
}
并尝试为该作品指定所有者:
Work work = new Work()
work.ProjectOwners.Add(person) //NULL REF ERROR HERE
db.Work.Add(work)
我得到一个空引用错误,我想这是因为数据库中还没有工作?那么,我必须插入工作,然后找到它,然后附加的人吗?我不太明白还有多少作品和链接可以阅读到这篇文章中
更新
因此,下面的内容只工作一次,但当我创建一个新的工作时,任何与以前的工作一起保存的内容都会被删除。ProjectOwners
。如果对此有任何帮助,我理解原因(因为People
中的FK列将被下一个Work
PK覆盖),但我不知道如何修复它
work.ProjectOwners = new List<Person>();
work.ProjectOwners=新列表();
看看这个例子:
public class Work
{
public int WorkId { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> CurrentWorkers { get; set; }
public virtual ICollection<Person> ProjectOwners { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public string UserId { get; set; }
public virtual ICollection<Work> CurrentWork { get; set; }
}
public class WorkContext : DbContext
{
public DbSet<Work> Works { get; set; }
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Work>().
HasMany(w => w.ProjectOwners).
WithMany(p => p.CurrentWork).
Map(
m =>
{
m.MapLeftKey("WorkId");
m.MapRightKey("PersonId");
m.ToTable("WorkPersons");
});
}
}
公共课堂作业
{
公共int工作ID{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection CurrentWorkers{get;set;}
公共虚拟ICollection项目所有者{get;set;}
}
公共阶层人士
{
公共int PersonId{get;set;}
公共字符串用户标识{get;set;}
公共虚拟ICollection CurrentWork{get;set;}
}
公共类WorkContext:DbContext
{
公共数据库集工作{get;set;}
公共DbSet Persons{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()。
拥有许多(w=>w.ProjectOwners)。
有许多(p=>p.CurrentWork)。
地图(
m=>
{
m、 MapLeftKey(“工作ID”);
m、 MapRightKey(“PersonId”);
m、 ToTable(“工人”);
});
}
}
这里有一个简单的测试:
var personJohn = new Person() {UserId = "John Doe"};
var personJane = new Person() { UserId = "Jane Dee" };
var work = new Work();
work.ProjectOwners = new List<Person>();
work.ProjectOwners.Add(personJohn);
db.Works.Add(work);
db.SaveChanges();
work.ProjectOwners.Add(personJane);
db.SaveChanges();
var personJohn=newperson(){UserId=“John Doe”};
var personJane=newperson(){UserId=“Jane Dee”};
var work=新工作();
work.ProjectOwners=新列表();
work.ProjectOwners.Add(personJohn);
db.Works.Add(工作);
db.SaveChanges();
work.ProjectOwners.Add(personJane);
db.SaveChanges();
编辑:
添加数据库中已存在的人员(例如Jane)的变体:
var john=newperson(){UserId=“JohnDoe”};
var jane=newperson(){UserId=“JaneDee”};
//将Jane添加到数据库
db.Persons.Add(jane);
db.SaveChanges();
//创建新工作并初始化ProjectOwners集合
var work=新工作();
work.ProjectOwners=新列表();
//添加John(数据库中尚不存在)
work.ProjectOwners.Add(john);
db.Works.Add(工作);
db.SaveChanges();
//在DB中寻找Jane
jane=db.Persons.FirstOrDefault(x=>x.UserId==“JaneDee”);
if(jane!=null)
{
//如果找到工作项目所有者,则添加现有Jane
work.ProjectOwners.Add(jane);
}
db.SaveChanges();
在添加人员之前,我将为新创建的工作
初始化ProjectOwners
集合:Work.ProjectOwners=new List()代码>@Adolfo好吧,我是这么做的,但我只是在任何时候失去了引用,一个新作品是由同一个人作为所有者创建的?在这里,你会发现一个非常类似于你正在尝试做的例子:@Adolfo谢谢,但仍然不能按我想要的方式分配,目前我正在做相反的事情:person.OwnerOfWorks.Add(Work)now,因为这是唯一能给我带来合理结果的东西……几个问题:您是先使用实体框架代码吗?你能展示一下你的模型配置吗?您正在创建关系表吗?e、 g.工人。这将帮助专家更好地了解您的问题。感谢您抽出时间写上述内容,非常有帮助。我以为我要用我的模型做的不是很好,所以我重写了大部分,现在问题少了很多。我的一个问题是如何添加现有的db行?假设Jane已经存在于您的示例数据库中,则执行:var Jane=db.Person.Find(JaneID)
然后执行work.ProjectOwners.Add(Jane)
?我还可以要求您提供更多关于使用EF创建更复杂模型的阅读材料吗?MSDN网站上有很好的材料:我还建议您观看第9频道的朱莉·勒曼视频:@Wurd看看我编辑的答案。我添加了一个关于如何将数据库中已经存在的人添加到工作对象的示例。
var personJohn = new Person() {UserId = "John Doe"};
var personJane = new Person() { UserId = "Jane Dee" };
var work = new Work();
work.ProjectOwners = new List<Person>();
work.ProjectOwners.Add(personJohn);
db.Works.Add(work);
db.SaveChanges();
work.ProjectOwners.Add(personJane);
db.SaveChanges();
var john = new Person() {UserId = "JohnDoe"};
var jane = new Person() { UserId = "JaneDee" };
//Add Jane to DB
db.Persons.Add(jane);
db.SaveChanges();
//Create new Work and initialize ProjectOwners collection
var work = new Work();
work.ProjectOwners = new List<Person>();
//Add John (doesn't exist in DB yet)
work.ProjectOwners.Add(john);
db.Works.Add(work);
db.SaveChanges();
//Look for Jane in DB
jane = db.Persons.FirstOrDefault(x => x.UserId == "JaneDee");
if (jane != null)
{
//Add existing Jane if found to work Project Owners
work.ProjectOwners.Add(jane);
}
db.SaveChanges();