在实体框架C#中,如何在不将第一个实体插入数据库的情况下将实体Id分配给另一个实体?
假设我有两个具有多对一关系的表:Book->Author。作者可以有多本书。所以,Book实体具有Author和AuthorId导航属性 例如,Author表包含一行:AuthorName。我只想在名称唯一的情况下插入新作者 因此,我所做的是:在实体框架C#中,如何在不将第一个实体插入数据库的情况下将实体Id分配给另一个实体?,c#,database,entity-framework,foreign-keys,C#,Database,Entity Framework,Foreign Keys,假设我有两个具有多对一关系的表:Book->Author。作者可以有多本书。所以,Book实体具有Author和AuthorId导航属性 例如,Author表包含一行:AuthorName。我只想在名称唯一的情况下插入新作者 因此,我所做的是: var book = new Book(); var authorFromDatabase = getAuthorFromDbByName("author name"); if(authorFromDatabase == null) { // i
var book = new Book();
var authorFromDatabase = getAuthorFromDbByName("author name");
if(authorFromDatabase == null)
{
// insert new author if it is not already in the database
book.Author = new Author("author name");
}
else
{
// how to assign AuthorId to book so that it will not add new Author to the db??
// the following line inserts new author into the db
book.AuthorId = authorFromDatabase .AuthorId;
}
那么,如何将AuthorId分配给book,而不在db中插入新的作者呢?设置
。AuthorId
属性不会在db中创建新的作者,这怎么可能呢?实际上,您并不是在构造一个新的Author
对象并将其添加到DbContext
中。从您给我们看的内容来看,如果(authorFromDatabase==null)
总是解析为True
,则似乎是。您是否调试了代码以确保执行else
块
您可能应该显示更多的代码,例如您的作者
和书籍
实体类,以及您的getAuthorFromDbByName(…)
方法实现,以及您实例化数据库上下文
实例的位置。如果是关于唯一性,我会这样做:
// some code
newBook.Author = CreateOrGetAuthor("The Name");
// more code
private Author CreateOrGetAuthor(string authorName)
{
var author = _context.Authors.SingleOrDefault(a => a.Name.Equals(authorName, StringComparison.CurrentCultureIgnoreCase));
if (author == null)
{
author = new Author();
author.Name = authorName;
}
return author;
}
现在,这取决于您是否在这两个调用周围使用事务。如果没有,则必须首先调用_context.SaveChanges(),并在CreateOrGetAuthor中返回作者。否则它将没有ID。它是先编码的吗?ID是由数据库生成的吗?关于book.Author=authorFromDatabase代码>?@sprinter252,首先是数据库,在数据库中生成AuthorId。我会这样说:book.Author=authorFromDatabase??新作者(“作者姓名”);那个么,您的问题是名称的唯一性吗?很抱歉误导了您,setting.AuthorId(适用于我)只是缺少了一些东西。不管怎样,一切都正常,谢谢,在你的回答之后,我再次检查了所有内容并解决了我的问题。如果(authorFromDatabase==null)不总是解析为True。因为我在数据库中已经有一些条目,我想更新它们