c # - EntityFramework opdatering delmodel

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på mvc-projekt, med lagermønster og enhedsramme, nu på min form har jeg en prøve model


SampleModel

1) navn

2) alder

3) adresse

4) noter

5) opdateret dato



Jeg viser kun følgende data på redigeringsformularen

1) navn

2) alder

3) adresse



nu, hvis jeg opdaterer modellen med manglende egenskabsværdier ved hjælp af lageret, bliver noterne, datoopdateret felt null.


Mit spørgsmål er, hvordan opdaterer jeg kun få udvalgte egenskaber ved hjælp af lageret (tryupdatomodel ikke tilgængelig i lageret), og jeg ønsker ikke at ringe til det oprindelige objekt og kortlægge properites med den opdaterede model.


Er der nogen måde, må der være.

Bedste reference


Du kan kun opdatere delmængder af felter:


using (var context = new YourDbContext())
{
    context.SamepleModels.Attach(sampleModel);

    DbEntityEntry<SameplModel> entry = context.Entry(sampleModel);
    entry.Property(e => e.Name).IsModified = true;
    entry.Property(e => e.Age).IsModified = true;
    entry.Property(e => e.Address).IsModified = true;   

    context.SaveChanges();
}


eller i ObjectContext API:


using (var context = new YourObjectContext())
{
    context.SamepleModels.Attach(sampleModel);

    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sampleModel);
    entry.SetModifiedProperty("Name");
    entry.SetModifiedProperty("Age");
    entry.SetModifiedProperty("Address"); 

    context.SaveChanges();
}

Andre referencer 1


Dette er en gammel tråd, men hvis nogen er interesseret i at udvide Ladislavs løsninger, har vi fået en nyttig udvidelsesmetode til EF 4.1 og nyere:


public static void SetModified<TEntity>(
        this DbEntityEntry<TEntity> entry,
        IEnumerable<Expression<Func<TEntity, object>>> expressions) where TEntity : class, IEntity
    {
        foreach (var expression in expressions)
            entry.Property(expression).IsModified = true;
    }


Det er klart, at du bliver nødt til at fjerne iEntity-begrænsningen, medmindre du bruger en grænseflade med samme navn til dine POCO'er.


Eksempelbrugen ville være:


        var user = new User
        {
            Id = Request.Id,
            UserName = Request.UserName,
            FirstName = Request.FirstName
        };

        var expressions = new List<Expression<Func<User, object>>> 
                 { 
                     x => x.UserName, 
                     x => x.FirstName
                 };

        context.Entry(user).SetModified(expressions);