在实体框架C#中,如何在不将第一个实体插入数据库的情况下将实体Id分配给另一个实体?

在实体框架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

假设我有两个具有多对一关系的表:Book->Author。作者可以有多本书。所以,Book实体具有Author和AuthorId导航属性

例如,Author表包含一行:AuthorName。我只想在名称唯一的情况下插入新作者

因此,我所做的是:

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。因为我在数据库中已经有一些条目,我想更新它们