Simply i wanna know
update table set (name,surname) values ('John','Locke') where Id=1
sql statment equivalent in llblgen, i tried below code but it didn't work.
Entity e = new Entity();
entity.Id = 1;
entity.name = "John";
entity.surname = "Locke";
entity.Save();
can anyone help?
Basically what you are doing above is creating a totally new entity. To update an existing one use this:
Entity e = new Entity(1);
entity.name = "John";
entity.surname = "Locke";
entity.Save();
The key is the first line. As you are using SelfServicing, in that line LLBLGen Framework will try to fetch the entity, if it exists on DB then the data is retrieved into the entity, otherwise the entity is treated as new. As the entity exists on DB, the values that are actually changed (i.e. the fetched field value is different from the one you actually set) will be used in the UPDATE sql query.
This is explained in the documentation.
Related
I have lots of tables that contain default values, such as CreatedDateTime (getutcdate()). But right now, the value 0001-01-01 00:00:00.0000000 gets stored instead.
https://stackoverflow.com/a/35093135/7731479 --> that is not effective, I have to do it for each table manually for every database model update (edmx). How can I update all StoreGeneratedPattern to Computed automatically? Or why it does not takes computed automatically?
https://stackoverflow.com/a/43400053/7731479 --> ado.net generates all properties and I can't generate again CreatedDateTime.
Are there any automatic solution?
I am using Entity Framework and ado.net.
Person person = new Person()
{
Id = id,
Name = name,
};
AddToPerson(person);
SaveChanges();
I want to use above. I don't want use the following and assign CreatedDeteTime again because it is assigned in MSSQL with default value getutcdate().
Person person = new Person()
{
Id = id,
Name = name,
CreatedDeteTime = DateTime.UtcNow;
};
AddToPerson(person);
SaveChanges();
The configured default constraint of the SQL Server table will only be applied if you have a SQL INSERT statement that omits the column in question.
So if you insert
INSERT INTO dbo.Person(Id, Name) VALUES (42, "John Doe")
--> then your CreatedDateTime will automatically be set to the GETUTCDATE() value.
Unfortunately, if you have mapped this column in your EF model class, then this is not what happens. If you create an instance of Person in your C# code, and the CreatedDateTime column is in fact part of the model class, then EF will use something like this to insert the new person:
INSERT INTO dbo.Person(Id, Name, CreatedDateTime) VALUES (42, "John Doe", NULL)
and since now NULL is in fact provided for the CreatedDateTime column, that's the value that will be stored - or maybe it's an empty string - no matter what, the column is specified in the INSERT statement and thus the configured default constraint is not applied.
So if you want to let SQL Server kick in with the defaults, you need to make sure not to provide the column(s) in question in the INSERT statement at all. You can do this by:
having a separate model class just for inserts, which does not include those columns in question - e.g. have a NewPerson entity, that also maps to the Person table, but only consists of Name and ID for instance. Since those properties aren't there, EF cannot and will not generate an INSERT statement with them - so then the SQL Server default constraints will kick in
map the INSERT method to a SQL Server stored procedure and handle the inserting inside that procedure, by explicitly not specifying those columns you want to have take on default values
May be I'm wrong, but I have a question.
If you need to save a default date in your DB Table, why you're trying to save another date from programm level? I mean, it's easy to create a procedure and on the procedure level save the date. Something like (select getdate()...).
I have found two solutions:
1- This solution solve for all entities that has same property such as CreatedDateTime
public partial class MyEntities : ObjectContext
{
public override int SaveChanges(SaveOptions options)
{
this.DetectChanges();
foreach (var insert in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added))
{
if (insert.Entity.GetType().GetProperty("CreatedDateTime") != null && insert.Entity.GetType().GetProperty("CreatedDateTime").GetType().Name == "DateTime" && (DateTime)(insert.Entity.GetType().GetProperty("CreatedDateTime").GetValue(insert.Entity)) == DateTime.Parse("0001-01-01 00:00:00.0000000"))
insert.Entity.GetType().GetProperty("CreatedDateTime").SetValue(insert.Entity, DateTime.UtcNow, null);
}
return base.SaveChanges(options);
}
}
referance: https://stackoverflow.com/a/5965743/7731479
2-
public partial class Person
{
public Person()
{
this.CreatedDateTime = DateTime.UtcNow;
}
}
referance : DB default value ignored when creating Entity Framework model
I am working on Entity framework with database first approach and I came across below issue.
I have a Customer table with columns col1, col2, col3 ,....,col8. I have created an entity for this table and this table has around 100 records already. Out of above 8 columns, col4 is marked as Non-null.
Class Customer
{
member col1;
member col2;
member col3;
member col4;
.
.
member col8;
}
class Main
{
//main logic to read data from database using EF
Customer obj = object of Customerwith values assigned to col1,col2 and col3 members
obj.col2=some changed value.
DBContext.SaveChanges(); //<- throws an error stating it is expecting value of col4.
}
In my application, I am trying to read the one of the record using the stored procedure using EF and stored procedure only returns col1,col2 and col3.
I am trying to save the modified value of col2 and trying to save back to database using DBContext. But it thows an error stating value of required field col4 is not provided.
FYI: I have gone through couple of forums and question and option to go with disabled verfication on SaveChanges is not feasible for me.
Is there any other way through which I can achieve partial update?
I guess EntityFramework.Utilities satisfies your conditions.
This code:
using (var db = new YourDbContext())
{
db.AttachAndModify(new BlogPost { ID = postId }).Set(x => x.Reads, 10);
db.SaveChanges();
}
will generate single SQL command:
exec sp_executesql N'UPDATE [dbo].[BlogPosts]
SET [Reads] = #0
WHERE ([ID] = #1)
',N'#0 int,#1 int',#0=10,#1=1
disabled verfication on SaveChanges is not feasible for me
Sure it is. You even have to disable validation on Save. But then you can't mark the whole entity as modified, which I think you did. You must mark individual properties as modified:
var mySmallCustomer = someService.GetCustomer(); // from sproc
mySmallCustomer.col2 = "updated";
var myLargeCustomer = new Customer();
context.Customers.Attach(myLargeCustomer);
Entry(myLargeCustomer).CurrentValues.SetValues(mySmallCustomer);
// Here it comes:
Entry(myLargeCustomer).Property(c => c.col2).IsModified = true;
context.Configuration.ValidateOnSaveEnabled = false;
context.SaveChanges();
So you see it's enough to get the "small" customer. From this object you create a stub entity (myLargeCustomer) that is used for updating the one property.
I'm facing a problem that when I set a field any value than empty, EF will update the database.
But, when I clear the field (input[text] empty), the matching field in DB won't update to NULL.
Here are the codes:
C#
var entidade = new Plantas { CodPlanta = vm.CodPlanta };
db.Plantas.Attach(entidade);
entidade.CodEstado = vm.CodEstado;
entidade.NomePlanta = vm.NomePlanta;
entidade.CEP = vm.CEP;
entidade.Telefone = vm.Telefone;
entidade.Fax = vm.Fax;
db.SaveChanges();
SQL generated by EF
exec sp_executesql N'update [dbo].[Plantas]
set [CodEstado] = #0, [NomePlanta] = #1, [CEP] = #3
where ([CodPlanta] = #4)
',N'#0 int,#1 varchar(200),#3 char(8),#4 int',
#0=26,
#1='ApiaĆ',
#2='Integrada',
#3='18320000',
#4=373
go
See that when vm.Telefone and vm.Fax, these fields won't show in UPDATE query. But if a put some value, they will.
Even if the fields have some value before.
If a put a breakpoint at db.Savechanges(), it will show entidade.Telefone = null. But it won't go to the generated query.
How can I force Entity Framework to set fields to null?
The reason is that EF will only save modified fields. So if the field was null before you attach the object, and you set it to null again, EF will not update the database.
The solution is pretty simple: set the field to something other than null before you attach the object, than modify it to null before you save it.
One caveat: if you have optimistic concurrency control on the field, you may have to read the record from the database instead of attaching an empty object. Alternatively, use one column for optimistic concurrency control, such as a version number or SQL Server timestamp column.
For example, say you have this problem with the CEP column. Then do:
var entidade = new Plantas { CodPlanta = vm.CodPlanta };
entidade.CEP = "fake old value";
db.Plantas.Attach(entidade);
entidade.CEP = vm.CEP;
db.SaveChanges();
I found that setting attached instance of entity to "Modified" works:
db.Entry(entidade) = EntityState.Modified;
db.SaveChanges();
I have the following function to update and insert a record in the table
public DASInput UpdateDASInputTable(DASInput fileSetData, Guid programID)
{
string connectionString = GetConnectionString(programID);
BI_ProgramConfigurationEntities dataContext = new BI_ProgramConfigurationEntities(connectionString);
dataContext.DASInputs.ApplyChanges(fileSetData);
dataContext.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave);
fileSetData = dataContext.DASInputs.FirstOrDefault();
return fileSetData;
}
When I make first call with a new object of type DASInput, then it gets inserted correctly in the database. (DASInput table has the primary key as int with identity specification on).
But this first time insertion does not return the modified value of the primary key of the DASInput table.
So on every subsequent call a new record gets inserted in the database. I want the primary key(self generated by DB) to be returned to the client when the record gets inserted.
Isn't the syntax for adding an entity into a linq controlled database more along the lines of :
context.Table.AddObject(newStore);
//or
context.Table.Add(newStore);
context.SaveChanges();
I do answer this tentatively, not being hugely knowledgeable on LINQ.
I have a problem with Entity Framework in ASP.NET. I want to get the Id value whenever I add an object to database. How can I do this?
According to Entity Framework the solution is:
using (var context = new EntityContext())
{
var customer = new Customer()
{
Name = "John"
};
context.Customers.Add(customer);
context.SaveChanges();
int id = customer.CustomerID;
}
This doesn't get the database table identity, but gets the assigned ID of the entity, if we delete a record from the table the seed identity will not match the entity ID.
It is pretty easy. If you are using DB generated Ids (like IDENTITY in MS SQL) you just need to add entity to ObjectSet and SaveChanges on related ObjectContext. Id will be automatically filled for you:
using (var context = new MyContext())
{
context.MyEntities.Add(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
Entity framework by default follows each INSERT with SELECT SCOPE_IDENTITY() when auto-generated Ids are used.
I had been using Ladislav Mrnka's answer to successfully retrieve Ids when using the Entity Framework however I am posting here because I had been miss-using it (i.e. using it where it wasn't required) and thought I would post my findings here in-case people are looking to "solve" the problem I had.
Consider an Order object that has foreign key relationship with Customer. When I added a new customer and a new order at the same time I was doing something like this;
var customer = new Customer(); //no Id yet;
var order = new Order(); //requires Customer.Id to link it to customer;
context.Customers.Add(customer);
context.SaveChanges();//this generates the Id for customer
order.CustomerId = customer.Id;//finally I can set the Id
However in my case this was not required because I had a foreign key relationship between customer.Id and order.CustomerId
All I had to do was this;
var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer};
context.Orders.Add(order);
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order
Now when I save the changes the id that is generated for customer is also added to order. I've no need for the additional steps
I'm aware this doesn't answer the original question but thought it might help developers who are new to EF from over-using the top-voted answer for something that may not be required.
This also means that updates complete in a single transaction, potentially avoiding orphin data (either all updates complete, or none do).
You need to reload the entity after saving changes. Because it has been altered by a database trigger which cannot be tracked by EF. SO we need to reload the entity again from the DB,
db.Entry(MyNewObject).GetDatabaseValues();
Then
int id = myNewObject.Id;
Look at #jayantha answer in below question:
How can I get Id of the inserted entity in Entity framework when using defaultValue?
Looking #christian answer in below question may help too:
Entity Framework Refresh context?
You have to set the property of StoreGeneratedPattern to identity and then try your own code.
Or else you can also use this.
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
The object you're saving should have a correct Id after propagating changes into database.
I come across a situation where i need to insert the data in the database & simultaneously require the primary id using entity framework.
Solution :
long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
{
InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
InfoBase.Add(generalinfo);
InfoBase.Context.SaveChanges();
id = entityclassobj.ID;
return id;
}
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
This will work.
You can get ID only after saving, instead you can create a new Guid and assign before saving.
All answers are very well suited for their own scenarios, what i did different is that i assigned the int PK directly from object (TEntity) that Add() returned to an int variable like this;
using (Entities entities = new Entities())
{
int employeeId = entities.Employee.Add(new Employee
{
EmployeeName = employeeComplexModel.EmployeeName,
EmployeeCreatedDate = DateTime.Now,
EmployeeUpdatedDate = DateTime.Now,
EmployeeStatus = true
}).EmployeeId;
//...use id for other work
}
so instead of creating an entire new object, you just take what you want :)
EDIT For Mr. #GertArnold :
There are two strategies:
Use Database-generated ID (int or GUID)
Cons:
You should perform SaveChanges() to get the ID for just saved entities.
Pros:
Can use int identity.
Use client generated ID - GUID only.
Pros:
Minification of SaveChanges operations.
Able to insert a big graph of new objects per one operation.
Cons:
Allowed only for GUID
When you use EF 6.x code first
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
and initialize a database table, it will put a
(newsequentialid())
inside the table properties under the header Default Value or Binding, allowing the ID to be populated as it is inserted.
The problem is if you create a table and add the
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
part later, future update-databases won't add back the (newsequentialid())
To fix the proper way is to wipe migration, delete database and re-migrate... or you can just add (newsequentialid()) into the table designer.
I am using MySQL DB & I have an AUTO_INCREMENT field Id .
I was facing the same issue with EF.
I tried below lines, but it was always returning 0.
await _dbContext.Order_Master.AddAsync(placeOrderModel.orderMaster);
await _dbContext.SaveChangesAsync();
int _orderID = (int)placeOrderModel.orderMaster.Id;
But I realized my mistake and corrected it.
The Mistake I was doing: I was passing 0 in my orderMaster model for Id field
Solution worked: Once I removed the Id field from my orderMaster model, It started working.
I know it was very silly mistake, but just putting here if anyone is missing this.