Referencing PetaPoco from App_Code class (Umbraco 7) - umbraco7

Trying to create a web service to use Petapoco, I have created the following in a cs file in App_code
using System;
using Umbraco.Core;
using Umbraco.Core.Persistence;
namespace utData{
public class MyDB{
public string demo(){
var dataContext = new PetaPoco.Database("umbracoDbDSN");
return "demo - OK";
}
}
}
However, using this from a web service call results in
CS0246: The type or namespace name 'PetaPoco' could not be found (are you missing a using directive or an assembly reference?)
var dataContext = new PetaPoco.Database("umbracoDbDSN");
Any way to fix this?

Umbraco wraps its use of PetaPoco, so if you want "clean" and separate use of PetaPoco, you will need to reference it in your project or in your case (when not compiling) place PetaPoco DLL(s?) in the bin folder.
Or you could google PetaPoco Umbraco and see how PetaPoco is used in Umbraco context. According to http://www.wiliam.com.au/wiliam-blog/using-petapoco-with-umbraco-is-pretty-sweet it goes something like this (for your example):
var db = applicationContext.DatabaseContext.Database;
// or ApplicationContext.Current.DatabaseContext.Database
if (!db.TableExist("blahblah"))
{
db.CreateTable(false);
}

Related

MVC Console app in VS 2017 - unable to serve razor views

I have created basic MVC application in asp.net core with Visual Studio 2017.
I got an error when trying to render index.cshtml
An error occurred during the compilation of a resource required to process this request. Please review the following specific error details and modify your source code appropriately.
Generated Code
One or more compilation references are missing. Possible causes
include a missing 'preserveCompilationContext' property under
'buildOptions' in the application's project.json.
The type or namespace name 'System' could not be found (are you
missing a using directive or an assembly reference?)
+
using System;
...
My whole console application is as short as it can be:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var host = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseKestrel()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseDeveloperExceptionPage();
app.UseMvc();
}
}
public class HomeController : Controller
{
[HttpGet("/")]
public ActionResult Index()
{
ViewBag.Message = "Hello world!";
ViewBag.Time = DateTime.Now;
return View();
}
}
}
Structure of my "project"
View
It's funny because the error tells me that I have to change something in project.json, but since Visual Studio 2017 there is no project.json anymore.
My view is in fact simple static html file and does not require any references to models or anything. But errors are complaining about missing types:
I tried to compare my project to web application template but I havent found what's causing razor views not to build in console application.
What am I missing here?
Try adding
<PropertyGroup>
<PreserveCompilationContext>true</PreserveCompilationContext>
</PropertyGroup>
to your csproj. And to avoid such mistakes next time, please use the ASP.NET Core templates you can find when you create a new project. They have the necessary stuff and commonly used packages added to it's csproj.
There is a different SDK to use.
Console Apps use: Microsoft.NET.Sdk
Web Apps use: Microsoft.NET.Sdk.Web
This can be updated in your *.csproj

Http.EnumRouteContraint must implement System.Web.Routing.IRouteConstraint

I'm using AttributeRouting in my Web API project. I've installed the AttributeRouting for Web API. I want to define an Enum route constraint so I setup my AttributeRoutingHttpConfig config as follows:
using System.Reflection;
using System.Web.Http;
using AttributeRouting.Web.Http.Constraints;
using AttributeRouting.Web.Http.WebHost;
using MyProject.Data.Models;
[assembly: WebActivator.PreApplicationStartMethod(typeof(PhantasyTour.AttributeRoutingHttpConfig), "Start")]
namespace MyProject
{
public static class AttributeRoutingHttpConfig
{
public static void RegisterRoutes(HttpRouteCollection routes)
{
routes.MapHttpAttributeRoutes(
config =>
{
config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
config.InlineRouteConstraints.Add("ListType", typeof(EnumRouteConstraint<ListType>));
});
}
public static void Start()
{
RegisterRoutes(GlobalConfiguration.Configuration.Routes);
}
}
}
When I fire up my application I immediately receive the following error:
The constraint "AttributeRouting.Web.Http.Constraints.EnumRouteConstraint`1[[MyProject.Data.Models.ListType, MyProject.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]" must implement System.Web.Routing.IRouteConstraint
I've looked at the source code for the AttributeRouting.Web.Http.Constraints.EnumRouteConstraint and confirmed that it implements IHttpRouteConstraint which presumably is the WebAPI equivalent of IRouteConstraint in the MVC namespace.
Does anyone know what I'm doing wrong and how I can get this working?
UPDATE:
I attempted to create a completely blank Web Application and add only WebAPI and AttributeRouting for WebAPI references. Despite having absolutely no references to MVC assemblies, I still receive the same error message. I did discover however that there is another EnumRouteConstraint found in the AttributeRouting.Web.Constraints namespace which works perfectly. It doesn't appear to be MVC specific since it is located in the Core AttributeRouting assembly. I would love to know why there are two different EnumRouteConstraint classes when only one of them works. But that is a question for another time.
It is interesting that the exception you get refers to the MVC interface from the namespace System.Web.Routing.
I would take it as a clue and look at all the references in your project, any place in the config where MVC Routes and Http Routes could have been mixed up.
If possible and if you have any at all, try removing all references to MVC (or System.Web.Routing for a start), and MVC flavour of attribute routing (if it's a separate dll).

Make .dbml file in a class library use connectionstring from config file without subclassing it

I have a class library that is referenced from a web application. The class library defaults to using TestProject.Properties.Settings.Default.NFU_Custom_Website_DataConnectionString1. I would like it to get the connectionstring from ConfigurationManager.ConnectionStrings.
I can't change the .designer.cs file because it will get overwritten. If possible I would like to avoid creating a class which inherits from the .dbml file and setting the connection string in there. My boss recommends creating a web application project and deleting all of the default.aspx etc files from it and using that instead of a class library, is this a viable solution?
Thanks
Joe
You can do that. We had done that inadvertently and I got this problem when I switched to a class library. Rather than switch back I found the answer here: Point connectionstring in dbml to app.config
In summary:
Set the connection property of the DBML to (none) in the designer. This will remove the default constructor from the DB Context class.
Create a partial class for your DB Context with a default constructor:
using System.Configuration;
namespace TestProject
{
public partial class MyDBContext
{
public MyDBContext() : base(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)
{
OnCreated();
}
}
}

How do you add htmlHelpers into the Spark virew

I want to use the htmlHelpers in my spark view but I keep getting the following errors.
error CS0234: The type or namespace name 'Mvc' does not exist in the
namespace 'System.Web' (are you missing an assembly reference?)
I have added the System.Web.Mvc assembly into the project. I have also added the following code into the module (just for the sake of getting it working - I'll probably need to add this code to the bootstrapper --- not sure how to do that yet!)
var settings = new SparkSettings()
.SetDebug(true)
.SetAutomaticEncoding(true)
.AddAssembly("System.Web")
.AddAssembly("System.Web.Mvc")
.AddNamespace("System.Web.Mvc")
.AddNamespace("System.Web.Mvc.Html");
I also tried adding the namespace to a _global.spark file
Can someone tell me exactly what I must do to use the htmlHelpers in my spark view please.
The default Spark base view for Nancy doesn't include the public HtmlHelper Html { get; set; } property.
You can see the default view here.
The Spark view implemented for MVC integration is here, and you'll see the Html property exposed, which allows your Spark view to access it and invoke helpers.
In theory, you can inherit from NancySparkView, and specify that as your base view in your Spark settings, and add that property along with references to System.Web.Mvc etc in that class and your views should then be able to call into the helpers assuming everything is referenced correctly.
I'm not a Nancy expert, but I'm sure the type of the View is different than that of Asp.Net MVC. So, theoretically, you shouldn't be able to use MVC helpers, since they require the Html property on the View.

Linq intellisense Missing on EF Object

I'm facing a strange type of issue.
In my VS Solution I have 3 projects.
ASP.Net App
C# Class Library (Used as my DAL and contains a EF .edmx file.
Windows Service App
The ASP.Net App can succesffully access the the EF Model and I can use either classic Linq or Lambda .First() etc. Everything works fine.
On my Windows Service App, I've added a reference to the DAL DLL , but for some reason, the Intellisense does not show up when I type in any code files in the windows service library. Example of my code below :
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace alertservice
{
class AlertPolling
{
dal.applicationEntities ent;
public AlertPolling()
{
ent = new dal.applicationEntities();
ent.Queries. // <--- ZERO INTELLISENSE HAPPENING HERE.
}
public void StartPolling()
{
}
}
}
Thanks guys. I managed to fix the problem by following the comments from flipchart.
I added a reference to System.Data.Entity which fixed it. Intellisense now coming up.

Resources