本人在学习WebApi MVC中遇见一个问题,求教.
我在数据库中建立的两个表:books 和 bookPath,并且在这两个表之间加了外键constraint,一对多的关系。(1book 对 多bookPath)
在C#的工程中我使用codefist用VS2017自动映射生成了表的class,并且我创建了一个bookModel包含了这两个class中的所有字段。我在post方法中,应该如何插入数据呢?
我的post代码如下:
public void PostBook( [FromBody] BookModel bookModel)
{
try {
using (BooksDBEntities enbook = new BooksDBEntities())
{
Book book = new Book()
{
bookName = bookModel.bookName
};
enbook.Books.Add(book);
enbook.SaveChanges();
BookPath path = new BookPath()
{
bookID = bookModel.bookID,
pathAddress = bookModel.pathAddress
};
enbook.BookPaths.Add(path);
enbook.SaveChanges();
}
}
catch (DbEntityValidationException dbEx) {
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
}
}
}
}
每次只能给book表中插入数据。bookpath不能执行,请各位帮忙指点一下
//实体伪代码,Books 一对多 BookPath public class Books { public int Id{get;set;} public string Name{get;set;} public virtual ICollection<BookPath> BookPaths{get;set} } public class BookPath { public int Id{get;set;} public string Path{get;set;} public int BookId{ get; set; } [ForeignKey("BookId")] public virtual Books Books { get; set; } } //你的PostBook方法,伪代码 public void PostBook(Books bookModel) { enbook.Books.add(bookModel); enbook.SaveChange(); } //调用PostBook,伪代码 var bookModel=new Books(){ Name="C#", BookPaths=new List<BookPath>(){ new BookPath(){ BookPath="F09-1" }, new BookPath(){ BookPath="F09-2" } } } PostBook(bookModel);
推荐你这个方法,同时插入主表和外表数据,由于你建立了主外键关系,EF会自动映射。
或者,把你上面的代码稍作修改:
books //假设这个是你的EF实体,应该是吧?
BookModel //这个是你的DTO?
var newBook = enbook.Books.Add(book); enbook.SaveChanges(); //此处savechange之后,bookModel并不会获得bookID BookPath path = new BookPath() { bookID = newBook.bookID, pathAddress = bookModel.pathAddress };
谢谢你的推荐,我马上试试,因为我之前想了用存储过程的方法去解决。但是你这个从代码方向出发的我也很喜欢,谢谢你。
试试去掉第一个 enbook.SaveChanges();
,通常也只需要一次 SaveChanges
我想了一个解决办法,我直接在数据库写了一个存储过程,完成两个动作。但是不知道在CODE段有没有解决的办法。去掉一个不好使。
book.Path.add(path)
主外键关系表:先添加外键表的数据,后主键表的数据,你好像弄反了