我有一个MVC应用程序,在控制器的POST方法中使用以下代码。我正在做EF添加,显然这是不对的。我希望它添加记录,如果它不存在,否则更新。我该怎么办呢?
try
{
AttributeEntities db = new AttributeEntities();
IEnumerable<string> items = viewModel.SelectedAttributes2;
int i = 0;
foreach (var item in items)
{
var temp = item;
// Save it
SelectedHarmonyAttribute attribute = new SelectedHarmonyAttribute();
attribute.CustomLabel = viewModel.ItemCaptionText;
attribute.IsVisible = viewModel.Isselected;
string harmonyAttributeID = item.Substring(1, 1);
// attribute.OrderNumber = Convert.ToInt32(order);
attribute.OrderNumber = i++;
attribute.HarmonyAttribute_ID = Convert.ToInt32(harmonyAttributeID);
db.SelectedHarmonyAttributes.Add(attribute);
db.SaveChanges();
}
}
答案 0 :(得分:1)
您需要检查数据库中是否有您要添加/更新的记录。如果查找返回null,则表示它不存在于数据库中。如果是,您可以修改您查找的记录并调用db.SaveChanges()来保留对数据库所做的更改。
修改强>
int id = Convert.ToInt32(harmonyAttributeID);
var existingEntry = db.SelectedHarmonyAttributes.SingleOrDefault(x => x.HarmonyAttribute_ID == id);
答案 1 :(得分:0)
确定添加或更新的一种常用方法是简单地查看标识符字段,并设置适当的状态。
using System.Data;
SelectedHarmonyAttribute attribute;
using (var db = new YourDbContext())
{
db.Entry(attribute).State = attribute.HarmonyAttribute_ID == 0 ? EntityState.Added : EntityState.Modified;
db.SaveChanges();
}
答案 2 :(得分:-1)
您可以导入System.Data.Entity.Migrations命名空间并使用AddOrUpdate扩展方法:
db.SelectedHarmonyAttributes.AddOrUpdate(attribute);
db.SaveChanges();
编辑: 我假设SelectedHarmonyAttributes的类型为DbSet
EDIT2: 这样做的唯一缺点(也可能不是你担心),是你的实体不负责它自己的状态变化。这意味着您可以将实体的任何属性更新为无效的内容,您可能希望在实体本身内部对其进行验证,或者可能需要执行其他一些您希望在更新时进行的处理。如果您担心这些问题,则应该在实体上添加一个公共Update方法,并首先检查它是否存在于数据库中。 e.g:
var attribute = db.SelectedHarmonyAttributes.SingleOrDefault(x => x.HarmonyAttribute_ID == harmonyAttributeID);
if (attribute != null)
{
attribute.Update(viewModel.ItemCaptionText, viewModel.Isselected, i++);
}
else
{
attribute = new Attribute(viewModel.ItemCaptionText, viewModel.Isselected);
db.SelectedHarmonyAttributes.Add(attribute);
}
db.SaveChanges();
您的更新方法可能如下所示:
public void Update(string customLabel, bool isVisible, int orderNumber)
{
if (!MyValidationMethod())
{
throw new MyCustomException();
}
CustomLabel = customLabel;
IsVisible = isVisible;
OrderNumber = orderNumber;
PerformMyAdditionalProcessingThatIAlwaysWantToHappen();
}
然后制作所有实体&#39;物业公共&#34;得到&#34;但保护&#34;设置&#34;所以他们无法从实体本身外部进行更新。这可能会有点相切但是使用AddOrUpdate方法会假设您不想控制更新的发生方式并保护您的域实体不会进入无效状态等。希望这会有所帮助!< / p>