Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts

Tuesday, November 19, 2013

Backing field for automatically implemented property [Field] must be fully assigned before control is returned to the caller

Working with structs in C# gives you a lot of flexibility on the way you design your applications, but since they are not reference types, they have some special features that we need to take in count.
Recently I was working on a web application and I created a struct to hold a pair of values that is being used very frequently. It is something like this
public struct StringTuple{
    public string Value1 {get; set;}
    public string Value2 {get; set;}
}
After some code changes, I decided that it would be a good option to have a constructor to pass the struct values
public struct StringTuple
{
 public StringTuple(string value1, string value2)
 {
  Value1 = value1;
  Value2 = value2;
 }
 public string Value1 { get; set; }
 public string Value2 { get; set; }
}
but the compiler started complaining, giving me the following error
Backing field for automatically implemented property Value1 must be fully assigned before control is returned to the caller
It was the first time that I had seen that error, so after some time of think and research I remembered one of the basic principles of working with structs: members are initialized when the default constructor is called. That is why creating a new constructor was creating a problem, since we were overloading the constructor call and skipping that member initialization

The solution

Since the problem is that we're not calling the default constructor, the solution is obviously call it, so we just need to add that call to the constructor that we just introduced.
public struct StringTuple
{
 public StringTuple(string value1, string value2):this()
 {
  Value1 = value1;
  Value2 = value2;
 }
 public string Value1 { get; set; }
 public string Value2 { get; set; }
}
By that, the error message is gone and we can continue happily working with structs

Thursday, November 15, 2012

Creating CodeCollaborator reviews using command line

Some months ago, I started using CodeCollaborator to create code reviews and ensure our developments have the desired quality.

We are at the end of our development sprint, so I tried to create some code reviews using the CodeCollaborator GUI with no success. Aparently, one of the latest Java VM updates "broke" my client; actually because we are using an old version of CodeCollaborator client (v 4) which cannot work under the latest versions of Java.

So if you run into the same problem, or just want to create your reviews using the command line follow the next steps described below. (Disclaimer: this was only tested on Windows and using SVN as source control, since that's our current development environment),


  1. Open the command line prompt
  2. Go to your working copy folder, some thing like this
    cd "C:\Folder\Folder\MyProjectWorkingCopyRoot"
  3. Login into your CodeCollaboration Server
    ccolab login  [ServerUrl] [UserName] [Password]
    
    You will get something like this
    Connecting to Code Collaborator Server https://[your.server.url]/
    Connected as: [Your name and username]
    
    New configuration worked - saving configuration settings
    Configuration key 'url' saved.
    Configuration key 'user' saved.
    Configuration key 'password' saved.
    Configuration key 'server-proxy-host' cleared.
    Configuration key 'server-proxy-port' cleared.
    
  4. You can upload specific files, changelists, etc. In my case I needed upload all the changes made on an specific revision, so I needed to pass a SVN diff as a parameter
    ccollab addsvndiffs new -r 27183:27190
    If you look I added the parameter "new" wich means I'm creating a new review (and will be named "Untitled Review"); you can also pass the review-id if you want to add files to an existing review.
With this, you can easily add files when creating or updating any CodeCollaborator review. For more information go to the CodeCollaboration command line reference 

Tuesday, November 6, 2012

Overcome to Windows Azure free trial cancellation by adding a new plan

I decided to try Windows Azure more than 3 months ago, most likely because of it's free 90-day offer. I can tell that I'm amazed on all the posibilies you have for free (Websites, Virtual machines, Mobile Services, etc.).

So then, I decided I wanted to continue with the service after my trial period ended by "acquiring" a Pay-As-You-Go plan (that as the name says, you pay only what you use only if you use it, so at the time of my purchase my total was $0.00).

Since I was swamped with many things at job, I didn't payed much attention on the warning e-mails saying that my account was about to expire. As it might be expected, my account was cancelled 2 weeks ago. Last week I was trying to upgrade my account, so I signed up on the Pay-As-You-Go plan but after several tries and wating days, I still wasn't able to use it to create new websites with it.



So this is the process that you need to follow in order to be able to use your new plan in your account:


  1. Acquire a new plan (Pay-As-You-Go, 6 or 12 month, etc.)
  2. Go to Preview Features page and select the feature that you want to enable for your new plan, in my case I wanted to be able to create websites again
  3. Click on "Try it now"
  4. Select the plan you want to associate (your new plan). In this case I'm showing an example with Media Services because I already joined to the Websites preview

After completing this, you will see a label on the screen saying that the feature is active



and you will be able to create websites (or any of the preview features that you selected) under your new plan


Sadly, my previous websites remain cancelled and it doesn't seem to be possible to associate them with my new plan, or at least I couldn't find a way to edit them on the manage portal.

So, if possible try to avoid your account cancellation, but if that already happened, this post might help you if your plan is not shown on some items on your account.

Saturday, November 3, 2012

Solution to: "The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable"

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

Problem description


The error quoted above happened to me after I started using AutoMapper on my WCF service for updating my entities. Previously, I had a "manual map" to assing the properties that I received on my data contract to the entity that I got on my context and update it. When we decided to implement AutoMapper on our project, my mapping code started like this:


Mapper.CreateMap<MyDataContract, MyEntity>.IgnoreAllNonExisting();


Since all my properties were named the same on both classes, everything seemed to be easy peasy.

But sadly, I started gotting the error message
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
This message was driving me crazy, because of the text I was thinking that I was making something wrong with the FK relationships on the Database, or in someway the field was being passed null without being null on the contract, or somebody changed the table in someway (yeah sure, blame others :-P). After some deep look on the code (including debugging line by line all the updating process) I found the error.

Since I'm copying the modified values (from DataContract to Entity) when mapping, I'm passing all the values from one instance to the other. This sounds OK, right? I mean, I want all my changes to be persisted on the database.

Well, is not that easy. Since my contract comes from a web application, when saving there I don't have all the navigation properties. When this is the case and I just map all, I'm also mapping and overwriting the values of this navigation properties, that in this case are null on my DataContract. This makes the Entity to update the ForeignKey Columns that belong to that navigation property to be null too. That is why the error says that you're sending null values, because actually you are.

Solution

Since the problem is that we're mapping null navigation properties, and we actually don't need them to be updated on the Entity since they didn't changed on the Contract, we need to ignore them on the mapping definition:

ForMember(dest => dest.RefundType, opt => opt.Ignore())


So my code ended up like this

Mapper.CreateMap<MyDataContract, MyEntity>
ForMember(dest => dest.NavigationProperty1, opt => opt.Ignore())
ForMember(dest => dest.NavigationProperty2, opt => opt.Ignore())
.IgnoreAllNonExisting();


And voilĂ ! the problem is solved.

Tuesday, August 28, 2012

Tic-Tac-R source code

After some tweaks, I'm releasing the source code of the Tic-Tac-R game. As you may find on the previous post, this game is an experiment on how to make a simple Tic-Tac-Toe game in a real-time web application using SignalR and host it on a cloud environment using Windows Azure.

I hope you find it useful for learning just as I did

Download the source code on Github

Wednesday, August 15, 2012

HealthyHarry: A healthy version of the traditional snake game over HTML5

As an experiment for learning HTML5 Canvas, I created this small game based on the popular "Snake" that many of us played on our old mobile phones (A Nokia 3320 in my case)

I deployed the game one of my Windows Azure websites and you can access it here. Initially I was thinking of buying a hosting account on a different place, but I think the cloud is a good place for host this kind of pet projects and Windows Azure is a great option, (IMHO) for 2 things: 1) Is extremely easy to use (saying creating websites, databases, deploying, etc) 2) It is free for 90 days, which is great if you are starting on the cloud "wave". Let's see what happen when the cloud bills begin to come.

So then, enjoy the game online for at least the next 60 days (when my free account expires :P)

The source code is hosted on Github. Feel free to do whatever you want with it

Tuesday, June 19, 2012

Send content to the layout using a Helper on CakePHP

This post is based on Robert Conner's code forCakePHP 1.x., and I made some changes to get it to work onCakePHP 2.x . The original post can be found here.
Maybe some people have faced problems trying to send some content to the layout on CakePHP. By content I mean not only a simple string but a whole a piece of HTML code. To solve this, we can create a Helper on CakePHP 2.x, according to the following steps:

1. Create the Helper

On theViews/Helpers folder, you need to create the .php file for the helper. In this case we will call it LayoutHelper.php
class LayoutHelper extends AppHelper {
 var $__blockName = null;
 function blockStart($name) {
  if (empty($name))
   trigger_error('LayoutHelper::blockStart - name is a required parameter');
  if (!is_null($this->__blockName))
   trigger_error('LayoutHelper::blockStart - Blocks cannot overlap');
  
  $this->__blockName = $name;
  ob_start();
  return null;
 }
 
 function blockEnd(&$view){
  $buffer = @ob_get_contents();
  @ob_end_clean();
  $out = $buffer
  $view->viewVars[$this->__blockName . '_for_layout'] = $out;
  $this->__blockName = null
 }

 function output($var) {
  if (isset($var) && $var != null)
  echo $var;
 }
}

2. Setting up the content

For setting up the content that we want to send to the layout, we use the Helper
$layout = $this->Helpers->load('Layout');
$layout->blockStart('custom_content');
Right after this, we specify the content that will be sent to the layout
<div>Custom content</div>
and we close the block
$layout->blockEnd($this);

3. Show the content

For showing the content on the layout, we add the following
$layout = $this->Helpers->load('Layout');
$layout->output($custom_content_for_layout);
As we can see, this is really simple and also very useful when trying to customize the content on the layout according to the view we are loading
I wrote this article also on The Bakery

 

Copyright @ 2013 A learning journey.