CTP5 EF Code First против Linq-to-sql - PullRequest
4 голосов
/ 19 февраля 2011

Хорошо, я знаю, что должен что-то делать не так, потому что время исполнения, которое я получаю, настолько разное, что это шокирует. Я рассматривал возможность использования первой опции кода для объекта в моем существующем проекте, поэтому я пытался провести тест производительности, чтобы посмотреть, как он сравнивается. Я использую MSpec для запуска тестов с удаленной базой данных разработки.

Вот мои тесты:

public class query_a_database_for_a_network_entry_with_linq : ipmanagement_object {
    protected static NetINFO.IPM_NetworkMaster result;
Because of = () => {
    var db = new NetINFODataContext();
    result = db.IPM_NetworkMasters.SingleOrDefault(c => c.NetworkID == 170553);
};

It should_return_an_ipm_networkmaster_object = () => {
    result.ShouldBeOfType(typeof(NetINFO.IPM_NetworkMaster));
};

It should_return_a_net_ou_object_with_a_networkid_of_4663 = () => {
    result.IPM_OUIDMaps.First().NET_OU.NET_OUID.ShouldEqual(4663);
};   

}

public class query_a_database_for_a_network_entry_with_entity_code_first : ipmanagement_object {
    protected static NetInfo.Core.Models.CTP.IPM_NetworkMaster result;

    Because of = () => {
        NetInfo.Core.Models.CTP.NetInfoDb db = new NetInfo.Core.Models.CTP.NetInfoDb();
        result = db.IPM_NetworkMasters.SingleOrDefault(c => c.NetworkID == 170553);
    };

    It should_return_an_ipm_networkmaster_object = () => {
        result.ShouldBeOfType(typeof(NetInfo.Core.Models.CTP.IPM_NetworkMaster));
    };

    It should_return_a_net_ou_object_with_a_networkid_of_4663 = () => {
        result.NET_OUs.First().NET_OUID.ShouldEqual(4663);
    };
}

Как вы можете видеть из текста данных с помощью linq-to-sql, я не могу получить доступ к объекту напрямую, который имеет отношение многие ко многим. Я должен использовать промежуточную таблицу поиска. Что является одной из вещей, которые мне нравятся в Entity Framework. Однако когда я запускаю эти тесты, проверка linq никогда не занимает больше 4 секунд (база данных удалена). Где проверка сущности занимает почти 8 секунд каждый раз. Не точно, почему есть такая огромная разница? Вот выдержки из моих классов POCO и мой dbcontext:

DbContext:

public class NetInfoDb : DbContext {
        public NetInfoDb() : base("NetINFOConnectionString") { }
        public DbSet<IPM_NetworkMaster> IPM_NetworkMasters { get; set; }
        public DbSet<IPM_NetworkType> IPM_NetworkTypes { get; set; }
        public DbSet<NET_OU> NET_OUs { get; set; }

        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {
            modelBuilder.Entity<IPM_NetworkMaster>()
                  .HasMany(a => a.NET_OUs)
                  .WithMany(b => b.IPM_NetworkMasters)
                  .Map(m => {
                      m.MapRightKey(a => a.NET_OUID, "NET_OUID");
                      m.MapLeftKey(b => b.NetworkID, "NetworkID");
                      m.ToTable("IPM_OUIDMap");
                  });
        }

    }

IPM_NetworkMaster:

public class IPM_NetworkMaster {
        public int NetworkID { get; set; }
        <snip>            
        public virtual ICollection<NET_OU> NET_OUs { get; set; }

    }

NET_OU:

public class NET_OU {
        public int NET_OUID { get; set; }
        <snip>
        public virtual ICollection<IPM_NetworkMaster> IPM_NetworkMasters { get; set; }
    }

1 Ответ

1 голос
/ 03 марта 2011

Как уже упоминалось, вам нужно профилировать свои запросы. Предполагая, что вы используете SQL Server, вы можете просто спулировать SQL Server Profiler и сравнивать запросы и планы выполнения.

Как и в случае любой проблемы с производительностью, вы должны измерить в первую очередь. С вашим сценарием вы должны сделать больше. Вы должны измерить дважды с каждой технологией и убедиться, что вы сравниваете яблоки с яблоками. Если вы можете исключить сгенерированный sql, вам придется измерить код приложения, чтобы, возможно, устранить любые узкие места.

Я подозреваю, что это будут сгенерированные запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...