• CodeFirst, как получить из базового объекта наследуемые?

    Ogoun
    @Ogoun
    Programmer
    public abstract class Product
        {
            public int ProductId { get; set; }
            public string Name { get; set; }
    
            public abstract int GetShopPrice(City city);
        }
    
        public sealed class SimpleProduct : Product
        {
            public override int GetShopPrice(City city)
            {
                //логика
            }
        }
        public sealed class ModuleProduct : Product
        {
            public override int GetShopPrice(City city)
            {
                //логика
            }
        }
    Ответ написан
    Комментировать
  • Как использовать переменные (SqlParameter) в запросе c ALTER TABLE из .NET приложения?

    Ogoun
    @Ogoun Автор вопроса
    Programmer
    Красивого варианта не нашел, сделал следующим образом:
    1. Создаются новые поля, всем разрешается иметь значения NULL (1 запрос)
    2. Таблица обновляется, полям которые должны быть NOT NULL проставляются значения по умолчанию (1 запрос)
    Можно полноценно использовать переменные
    UPDATE [TABLE_NAME] SET [COLUMN_NAME]=@COLUMN_DEFAULT_VALUE

    3. Обновляются поля которые должны быть NUTT NULL (1 запрос на каждое поле)
    ALTER TABLE [TABLE_NAME] ALTER COLUMN [COLUMN_NAME] COLUMN_TYPE NOT NULL
    Ответ написан
    Комментировать
  • C# Как из другого потока обновить control на форме?

    Ogoun
    @Ogoun
    Programmer
    Если поток выполняется где-то в бизнес-слое и не знает про форму, то можно использовать контекст синхронизации. Вот так:

    При создании формы:
    SynchronizationContext uiContext = SynchronizationContext.Current;
    Thread thread = new Thread(Run);
    // Запустим поток и установим ему контекст синхронизации,
    // таким образом этот поток сможет обновлять UI
    thread.Start(uiContext);


    Код потока:
    private void Run(object state)
        {
            // вытащим контекст синхронизации из state'а
            SynchronizationContext uiContext = state as SynchronizationContext;
             // говорим что в UI потоке нужно выполнить метод UpdateUI 
             // и передать ему в качестве аргумента строку
             uiContext.Post(UpdateUI, "Hello world!");
        }


    И код который выполняет действие по изменению UI
    /// <summary>
    /// Этот метод исполняется в основном UI потоке
    /// </summary>
    private void UpdateUI(object state)
    {
        sampleListBox.Items.Add((string)state);
    }


    При этом никаких beginInvoke'ов в методе UpdateUI уже не потребуется, т.к. код однозначно исполняется в UI потоке.
    Ответ написан
  • Что почитать о том, как создать многопользовательскую программу WPF C#?

    Ogoun
    @Ogoun
    Programmer
    Напишу не про базу. а про общую часть. Здесь хорошо бы разделить на слои приложение, UI (WPF приложение), веб-сервис, и БД. Соответственно все взаимодействие с БД идет через веб-сервис, и WPF приложение вообще не знает про базу, работая с моделью. На уровне веб-сервиса реализуется авторизация, и определяется набор операций доступных пользователю (например, админ может все, оператор только операции чтения вызывать). Автоматически получаем многопользовательское приложение, к веб-сервису можно будет подключить сколько угодно WPF клиентов. (соответственно не только WPF при необходимости).

    В одной из своих реализаций, где набор данных ограничивался до 100 мегабайт, я вообще использовал SQL Compact Edition, запись(редкая в проекте операция) велась в базу, при запуске веб-сервиса все данные помещались в оперативную память из базы и при чтении данных к диску обращений не было.

    Создание веб-службы
    Еще пример

    Создание прокси на веб-службу
    Хотя мне нравится делать прокси вручную, больше гибкости:
    [WebServiceBinding(Namespace = "SampleWebService")]
        public class SampleWebServiceProxy : SoapHttpClientProtocol
        {
            public SampleWebServiceProxy(string serviceUrl)
            {
                Url = serviceUrl;
                UseDefaultCredentials = true;
            }
    
            protected override WebRequest GetWebRequest(Uri uri)
            {
                WebRequest webRequest = base.GetWebRequest(uri);
                ((HttpWebRequest)webRequest).ServicePoint.ConnectionLeaseTimeout = 0;
                return webRequest;
            }
    
            [SoapDocumentMethod("GetUser",
                Action = "http://domain/GetUser",
                Use = System.Web.Services.Description.SoapBindingUse.Literal,
                ParameterStyle = SoapParameterStyle.Wrapped)]
            [WebMethod(MessageName = "", Description = "")]
            public User GetUser(Guid id)
            {
                return InvokeMethodWithResult("GetUser", id);
            }
    		
    		[SoapDocumentMethod("UpdateUser",
                Action = "http://domain/UpdateUser",
                Use = System.Web.Services.Description.SoapBindingUse.Literal,
                ParameterStyle = SoapParameterStyle.Wrapped)]
            [WebMethod(MessageName = "", Description = "")]
            public void UpdateUser(User user)
            {
                return InvokeMethod("UpdateUser", user);
            }
    
            private object InvokeMethodWithResult(string methodName, params object[] args)
            {
                return Invoke(methodName, args ?? new object[] { }).FirstOrDefault();
            }
    
            private void InvokeMethod(string methodName, params object[] args)
            {
                Invoke(methodName, args ?? new object[] { }).FirstOrDefault();
            }
        }


    Собственно все. В комментарии выше показаны примеры для работы с базой. Использование фреймворков тут нецелесообразно, таблиц немного, проще будет вручную замапить на объекты.

    Получаем следующую схему:
    29347e299155457794990fe5883ba88a.png
    Ответ написан
    Комментировать
  • Большой веб проект у себя дома - это реально?

    Ogoun
    @Ogoun
    Programmer
    Может стоит насчет VDS-ок подумать, стоят сейчас копейки, например тут: serverdale.com
    тринити или квад стоят около 1000 в месяц, при этом безлимитный инет, и много места.
    Ответ написан
    Комментировать
  • На чём лучше писать большого демона?

    Ogoun
    @Ogoun
    Programmer
    C# отлично подойдет, делаю на нем невыгружаемые приложения, стабильно работают месяцами, память не протекает.
    Ответ написан
    Комментировать
  • Ежемесячно приходит счёт от Amazon?

    Ogoun
    @Ogoun
    Programmer
    Аналогичная ситуация, причем не просто просмотрел и отключил все что было, но и удалил все привязки от карт, и все равно раз в месяц производится попытка списания денег. Причем сама консоль в которой был инстанс просто не открывается теперь.
    Ответ написан
    Комментировать
  • Вопрос студентам, которые живут в студ.общежитиях. Как у вас обстоят дела с интернетом?

    Ogoun
    @Ogoun
    Programmer
    Сами делали на всю общагу через CDMA можем с раздачей через Ideco ICS Manager, лицензию которого мы просто выпросили у производителя) В итоге до 512Kb/s догоняли.
    Ответ написан
    Комментировать
  • Разыскивается IDE

    Ogoun
    @Ogoun
    Programmer
    Нет IDE кроме Visual Studio.
    Ответ написан
    Комментировать
  • Как залочить файл в JScript(WSH)?

    Ogoun
    @Ogoun Автор вопроса
    Programmer
    Решил вопрос, надо было открывать не на чтение, при проверкке блокировки, а также на добавление.

    
    var fso = new ActiveXObject('Scripting.FileSystemObject');
    var Lockeds = new ActiveXObject("Scripting.Dictionary");
    
    LockFile("2.ini");
    CheckLocking("2.ini");
    UnLockFile("2.ini");
    CheckLocking("2.ini");
    
    WScript.Quit();
    
    function LockFile(path) {
        if (!Lockeds.Exists(path)) {
            Lockeds.Add(path, fso.OpenTextFile(path, 8));
        }
    }
    
    function CheckLocking(path) {
        try {
            var t = fso.OpenTextFile(path, 8);
            t.Close();
            return false;
        }
        catch (e) {
        }
        return true;
    }
    
    
    function UnLockFile(path) {
        if (Lockeds.Exists(path)) {
            Lockeds.Item(path).Close();
            Lockeds.Remove(path);
        }
    }
    
    Ответ написан
    Комментировать