** Update ** EntityFramework detecting complex type with database first

Originally, I posted a question on StackOverflow

http://stackoverflow.com/questions/21630431/entityframework-detecting-complex-type-with-database-first

While we’re still not using complex types, we’ve worked out a mechanism to preventing our developers from breaking the autogenerated models when re-generating from the DB.

We’ve altered the T4 template generated by EF.

First we’ve created a method in the CodeStringGenerator class

public string BaseClassAndInterfaces(EntityType entity)
{
    var properties = new List<EdmProperty>(_typeMapper.GetSimpleProperties(entity));
    bool hasAuditFields = false;
    if (properties.Exists(property => _code.Escape(property) == "CreatedBy") &&
        properties.Exists(property => _code.Escape(property) == "CreatedDate") &&
        properties.Exists(property => _code.Escape(property) == "UpdatedBy") &&
        properties.Exists(property => _code.Escape(property) == "UpdatedDate"))
    {
        hasAuditFields = true;
    }
 
    return string.Format(" : {0}", hasAuditFields ? "Auditable" : "NotificationObject");
}

If it detects that a table contains those auditing fields, then it prepares to generate the class with a base class “Auditable”, which has those four properties. You’ll notice that if we don’t see the auditing properties, we then set the base class to NotificaitonObject. That’s because we’re still using our own variant of the deprecated Prism NotificationObject.

Next in the T4 template, in the class declaration, we do the following.

<#=codeStringGenerator.EntityClassOpening(entity)#><#=codeStringGenerator.BaseClassAndInterfaces(entity)#>

This basically outputs the

public class MyAwesomeAuditableModel : Auditable

Next it gets a bit messy. However, the goal of the following lines is to prevent the T4 template from autogenerating the columns that are already defined in the base class.

var simpleProperties = new List<EdmProperty>(typeMapper.GetSimpleProperties(entity));
if (simpleProperties.Any())
{
    bool hasAuditFields = false;
    if (simpleProperties.Exists(property => code.Escape(property) == "CreatedBy") &&
        simpleProperties.Exists(property => code.Escape(property) == "CreatedDate") &&
        simpleProperties.Exists(property => code.Escape(property) == "UpdatedBy") &&
        simpleProperties.Exists(property => code.Escape(property) == "UpdatedDate"))
    {
        hasAuditFields = true;
    }
 
    foreach (var edmProperty in simpleProperties)
    {
        if (!hasAuditFields ||
            (code.Escape(edmProperty) != "CreatedBy" &&
             code.Escape(edmProperty) != "CreatedDate" &&
             code.Escape(edmProperty) != "UpdatedBy" &&
             code.Escape(edmProperty) != "UpdatedDate"))
        {
#>
<#=codeStringGenerator.Property(edmProperty)#>
<#
        }
    }
}

That’s it! Now, we have our dev team, re-generating models all day long, high five-ing and hugging each other all through the days because of how awesomely convenient things are now.

Below is a link to the actual T4 template file that you can play with and see how it’ll impact your generated output classes. If you decide to use it, you will likely have to tweak it, to conform to the conventions in your environment.

http://www.ninjacrab.com/randomcodingdownloads/Example.tt

Keep on coding on!

PersistentWindows 1.0.5 and other updates!

Well 2014 has come and gone in a blink of an eye! Updates have been delayed due to various priorities as I was blessed with the birth of my second child the past year. I haven’t posted a new video, nor made updates to my little pet projects because it’s really hard to when you have an infant sleeping in the room adjacent to your “recording studio/living room”. That’s Manhattan living for you, but I still love it!

Regardless, mostly because of my amazing wife, I finally am able to get a full nights rest and continue delivering on my hobbies and ideas.

So first project update. I received such a motivating email from a random user who picked up PersistentWindows thanking me for the time I spent on it. I don’t ever expect to make any money off of that project and it was really intended to solve a problem that I was constantly dealing with at work myself. I did recently make some updates, based on some feedback and will continue to make some slow progress on the project, but just mostly out of necessity when pain drives change. 1.0.5 is released and has slightly smarter logic on when/how to capture the modified windows. Before, I was trying to capture based upon Windows Events, specifically if I received an event of a power change mode, I was going to capture the window changes and then when I receive a display change settings I could ignore the windows changing positions. However, what was actually happening was that the windows were moving prior to power event being broadcasted and thus my logic failed.

Now, I just wrote some logic that tries to determine if a number of windows larger than “X” change within one second. Currently X is 4 and My Theory is that no human can reliably modify the location of 4 windows in one second. If it turns out that people can, then I will bump up X or make it configurable, but so far at work that setting is doing just fine.

Second project update, I have received a few more awesome comments from generous people asking for more and as the subscribers are almost hitting 200, I’m disappointed that I can produce more content at the moment. I do have another video ready, based on user feedback, the problem is solved and script written, it’s just that almost every time I want to record I wake up the little one and have to stop. Some of my friends have suggested, “Make a funny video”, “Bait people in with a intro photo” or some other suggestion that would basically taint the reason I’m creating videos in the first place. My goal is to teach and spread knowledge and there are already so many more people out there funnier and more attractive than me. So with that, I will stay on topics and themes and hope that some how I can be a tiny impact in the direction that gives me satisfaction.

So with that, I do hope that this month or next I can finally get out another video!

“Keep on coding on” my fellow programmers!

Persistent Windows 1.0.3 & CodePlex

So I’ve updated yet another version of the PersistentWindows app, but this update is literally nothing but better logging, so that I can figure out what’s going on in various instances. I would love the logging output to help isolate the root cause and then I could move on to the convenience features.

Also, I’ve publish the code on CodePlex if anyone would like to contribute or are just generally interested.

I would love to make a video on this, but man it’s hard being a Dad, a Husband and a workaholic. I’ve missed this month, but maybe during my Thanksgiving break I can squeeze out a random coding video.

Bonne nuit!

Persistent Windows 1.0.2

Made a few changes that you can find in the release notes. What’s pretty awesome is that I posted this app as a solution in StackExchange’s Super user and it was well received by the OP. Enough, in fact where not only did he mark it as a solution, he also wanted to contribute in resolving the other edge case issues. So I’ll eventually plop on CodePlex and hopefully solve one of the world’s tiny problems 🙂

PersistentWindows 1.0.1 released

So I’ve been using the utility at work and it sometimes works and sometimes doesn’t. I’ve noticed a few issues

  1. Occasional race conditions occur when the monitor changes so I’ve improve the logic on resolution detection.
  2. I’ve also modified the little GUI to provide a bit more informative feedback.
  3. Improved the handler on maximized windows

Finally, I’ve also noticed that sometimes it doesn’t move a few windows and I was spinning the wheel a while to figure out why. Turns out those processes were running in admin, so if you want those restored, you have to run the utility as admin as well.

Slowly and surely, I’ll continue to improve the product.

Good night world!

Dealing with DisplayPort plug and play

So, I’m having an issue at work with my display setup. I have three monitors connected to my workstation, two via DisplayPort and one via DVI. Every time the monitors go to sleep it does the following:

  1. Windows gets a signal that the monitor has been disconnected
  2. Windows then re-arranges the windows that I had on the display port monitors to a desktop that it considers active(The DVI monitor)

When the monitor wakes up, I have to re-arrange my windows back to where I want them and this is an incredibly annoying task, especially as I take numerous coffee and bio breaks daily.

This is not special to any graphics card and there are numerous posts on this issue. This is the behavior of display port as it’s supposed to be “Plug and Play”. if I pull out the cable, that makes sense. However, powering off shouldn’t exhibit the same behavior as unplugging. Nvidia has a solution implemented in their drivers, that basically stores the monitor information and brute forces the state of the screen. However, I’ve got an AMD card on my workstation and it currently has no solutions.

So what’s my solution? I’m going to write one for a Random Coding project. I’ll have it freely available to download and will have a little bit of a video on the usage of it. While it may be interesting recording writing it from scratch and the dev journal, my schedule is insanely fragmented these days with two little boys and it would be hard to record as most of the days I’ll work on the project, lighting and my voice has to be low to let those guys sleep.

So MVP specs to get something out the door. Begin by building a polling implementation application that’s manually started with a window. Later we’ll try to find the right windows events, make it event driven and modify it to be a task tray application.

  1. Create a hash of the desktop display metrics as the key and a list of the window display metrics as a value
  2. Poll Number of monitors and screen resolutions and store as desktop display metrics
  3. Every second scan all windows and store window display metrics
  4. If the desktop display metrics change, check if the desktop hash key exists
    1. If it exists restore window positions.
    2. If it doesn’t store new positions of all windows

Gitmongous Distributed Repositories

So it’s been a little while as I’ve been busy assisting my beautiful wife on some projects she’s had, I’ve been at the tail end of a working marathon and finally I was on vacation last week. However, I’ve got a bit of free time now and I wanted to share an interesting downside of distributed version control systems.

Sometimes, you’ll have team members who will carelessly deposit massive multi-megabyte files, they’ll alter it to store more multi-megabyte files. These files then duplicate everywhere and make merging insanely painful from the sheer size.

There are solutions to this problem, but it’s a multi-step process that involves a priest, a rabbi, a shaman, 6 shots of vodka and a jump rope.

With that said, this isn’t entirely the same problem in a remote version controlled repository like Subversion. If some unrelated branch has all of the megafiles, you’re not sitting there staring at the progress indicator, scrolling in a pattern that seems like an infinite loop when you have to clone the repository.

So while, it won’t change our decision on what we’re using, it’s good to know and handy to monitor carefully as it will impact all of your team’s productivity.

100 YouTube Subscribers!

Yay!

So I’ve reach a small milestone of 100 YouTube subscribers! Besides the one or two friends that I have, most of them have discovered me either via the TopCoding video 1 or the RandomCoding Visual Studio snippets video.

After creating another 4 TopCoding videos, neither seemed to have the reigning success of the first video.

The Random Coding video 2 had a decent number of views because it was a difficult solution to find and I posted it on StackOverflow. However, all others are relatively unpopular.

I’d like to increase the reach of my videos, but I don’t want to radically change the intent. I want my videos to all be related to programming, yet have some entertaining spin.

I’ll start thinking of some ideas for May, but want to spend most of my energy on Conflicademia.

If any of you do have suggestions, I’m all ears!