Entity Framework C #: этот код является оптимальным? Как я могу улучшить это? - PullRequest
1 голос
/ 04 сентября 2011

Мне кажется, что следующий код неоптимален, и что может быть лучше.Я просто не знаю, как получить ключ без фиксации изменений.

var now = DateTime.Now;
var update = new DAL.ServerStatus
{
    Accounts = status.Accounts,
    Clients = status.Clients,
    Created = now,
    ServerStarted = status.ServerStarted,
    ServerDateTime = status.ServerDateTime
};

var context = DataContext.GetDataContext();
context.ServerStatus.AddObject(update);
context.SaveChanges();

foreach (var character in characters)
{
    var characterUpdate = new DAL.ServerOnlineCharacter
    {
        Account = character.Account,
        Alliance = character.Alliance,
        Created = now,
        Criminal = character.Criminal,
        DonationPoints = character.DonationPoints,
        EventCredits = character.EventCredits,
        FactionTyped = character.FactionTyped,
        FactionPoints = character.FactionPoints,
        Fame = character.Fame,
        GameTime = character.GameTime,
        Guild = character.Guild,
        GuildAbbreviation = character.GuildAbbreviation,
        GuildTitle = character.GuildTitle,
        Karma = character.Karma,
        Kills = character.Kills,
        MapTyped = character.MapTyped,
        RaceTyped = character.RaceTyped,
        RawName = character.RawName,
        Serial = character.Serial,
        ServerStatusId = update.Id
    };

    context.ServerOnlineCharacters.AddObject(characterUpdate);
}

context.SaveChanges();

В идеале я бы хотел, чтобы это было транзакционным, и мне не приходилось бы дважды обращаться к базе данных, чтобы полностью зафиксировать изменения.Как я мог добиться этого?

Кстати, метод заглушки:

static void Update(IServerStatusUpdate status, IEnumerable<IServerOnlineCharacterUpdate> characters);

1 Ответ

2 голосов
/ 04 сентября 2011

Если у вас есть update.Id, сопоставленный как первичный ключ, и между ServerOnlineCharacter и ServerStatus сопоставлена ​​взаимосвязь, то вы сможете сделать

characterUpdate.ServerStatus = update

вместо

characterUpdate.ServerStatusId = update.Id

Это позволит вам вызывать только context.SaveChanges в конце (а не в середине).

Что касается метода, выполняющего транзакции, EntityFramework придерживается TransactionScope, поэтому, если вы оберните свое обновлениевокруг TransactionScope и зафиксируйте его, когда вы будете готовы, он должен работать так, как вы ожидаете.

Вот пример использования транзакции

И если вы действительно хотитеЧтобы пройти лишнюю милю, вы можете взглянуть на что-то вроде AutoMapper , чтобы сопоставить интерфейс, который вы передаете в Update, с вашим классом DAL.Это уменьшило бы много кода там.

...