我在Asp.net mvc中遇到實體框架問題。每當向數據庫添加實體列表時,我都想獲得Id值。我怎樣才能做到這一點?如何添加實體列表以及如何獲取Id
我用這個代碼實體的列表中添加到數據庫:使用I DB生成的ID(如在MS SQL IDENTITY)
我在Asp.net mvc中遇到實體框架問題。每當向數據庫添加實體列表時,我都想獲得Id值。我怎樣才能做到這一點?如何添加實體列表以及如何獲取Id
我用這個代碼實體的列表中添加到數據庫:使用I DB生成的ID(如在MS SQL IDENTITY)
我認爲這個問題是在這部分代碼
public IEnumerable<TEntity> AddThisRange<TEntity>(IEnumerable<TEntity> entities) where TEntity : class
{
return ((DbSet<TEntity>)this.Set<TEntity>()).AddRange(entities);
}
var Tags = _uow.AddThisRange(newTags.Select(tagName => new Tag
{
//set properties
}));
_uow.SaveAllChanges();
foreach (var tag in Tags)
{
var id = tag.Id;// id always is 0
}
:
newTags.Select(tagName => new Tag
{
//set properties
}));
您選擇了Id = 0的corse的新標籤。
我使用此代碼測試這樣的:
class Program
{
static void Main()
{
List<Tag> tags = new List<Tag>() { new Tag { Id = 1, Name = "Tag1" }, new Tag { Id =2, Name = "Tag2" } };
var newTags = tags.Select(tagName => new Tag
{
});
foreach (var tag in newTags)
{
Console.WriteLine(tag.Id);
}
Console.ReadLine();
}
}
internal class Tag
{
public int Id { get; set; }
public string Name { get; set; }
}
您正在手動設置ID。正如OP所說,他們正在數據庫中生成。你不能在代碼中設置它們。 – andreasnico
請這只是一個例子,我不再模擬創作。問題不在那裏。問題出在選擇新標籤。不要貪婪地downvote – Coding4Fun
我認爲,「問題」是,ID是在數據庫中生成的。您必須首先保存標籤,然後再次獲取它們,然後才能在代碼中使用它們的標識。
事情是這樣的:
public IEnumerable<TEntity> AddThisRange<TEntity>(IEnumerable<TEntity> entities) where TEntity : class
{
return ((DbSet<TEntity>)this.Set<TEntity>()).AddRange(entities);
}
var Tags = _uow.AddThisRange(newTags.Select(tagName => new Tag
{
//set properties
}));
_uow.SaveAllChanges();
//Pseudocode:
var savedTags = _uow.GetSavedTags(newTags);
foreach (var tag in savedTags)
{
var id = tag.Id;// id will not be 0 anymore
}
什麼是GetSavedTags? – Coding4Fun
這是從數據庫中獲取標籤的僞代碼。我猜想OP的代碼中存在類似的東西。 – andreasnico
看到我的回答問題是在[Select(new Tag ...]。不需要從數據庫中重新加載數據 – Coding4Fun
試試這個,
public TEntity Create<TEntity>()
{
return ((DbSet<TEntity>)this.Set<TEntity>()).Create();
}
var listOfEntities =new List<Tag>();
foreach (var d in newTags)
{
var entity = _uow.Create<Tag>();
//set properties
//entity.prop=""
listOfEntities.Add(entity);
}
_uow.AddThisRange(listOfEntities);
_uow.SaveAllChanges();
,然後你可以看到ID值在列表中已經設置好的
foreach (var tag in listOfEntities)
{
var id = tag.Id;
}
你可以閱讀這篇文章什麼創造方法是做https://msdn.microsoft.com/en-us/library/gg696136(v=vs.113).aspx
您是否測試過在AddThisRange調用之後從數據庫中獲取標記,然後檢查標識是什麼? – andreasnico
yes.ID在數據庫中創建。 – testStack201541
這就是解決方案:) – andreasnico