首页 新闻 会员 周边

WebApi MVC C#

0
悬赏园豆:5 [已解决问题] 解决于 2018-08-08 22:12

本人在学习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不能执行,请各位帮忙指点一下

僧正的主页 僧正 | 初学一级 | 园豆:193
提问于:2018-08-06 20:55
< >
分享
最佳答案
0
//实体伪代码,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
}; 

 

收获园豆:5
找不到一个满意的昵称 | 菜鸟二级 |园豆:243 | 2018-08-08 15:41

谢谢你的推荐,我马上试试,因为我之前想了用存储过程的方法去解决。但是你这个从代码方向出发的我也很喜欢,谢谢你。

僧正 | 园豆:193 (初学一级) | 2018-08-08 22:11
其他回答(3)
0

试试去掉第一个 enbook.SaveChanges(); ,通常也只需要一次 SaveChanges

dudu | 园豆:30994 (高人七级) | 2018-08-06 21:37

我想了一个解决办法,我直接在数据库写了一个存储过程,完成两个动作。但是不知道在CODE段有没有解决的办法。去掉一个不好使。

支持(0) 反对(0) 僧正 | 园豆:193 (初学一级) | 2018-08-06 21:48
0

book.Path.add(path)

吴瑞祥 | 园豆:29449 (高人七级) | 2018-08-06 23:46
0

主外键关系表:先添加外键表的数据,后主键表的数据,你好像弄反了

唯我独萌 | 园豆:537 (小虾三级) | 2018-08-07 08:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册