Net Core NLog.Web "aspnet-user-identity" is empty? - asp.net-core-mvc

I was using "NLog.Extensions.Logging" for logging and need to log user identity and found that it is possible with "NLog.Web.AspNetCore". "nlog.config" file is configured to log the "aspnet-user-identity". However, when I look at logs, user identity part is always empty string, the other columns are look pretty good. Am I missing something?
A part of my configuration file is here:
<extensions>
<assembly="NLog.Web.AspNetCore" />
</extensions>
<parameter name="#identity" layout="${aspnet-user-identity}"/>
<logger name="*" minlevel="Trace" appendTo="database"/>
And an insert command insert a log to db with "#identity" parameter, but it is always empty like I said.

Accepted answer didn't worked for my case (using JwtSecurityToken on ASP.NET Core 3.1),
Later realized that I just forgot to add the ClaimTypes.Name on my JwtSecurityToken Claims.
Now its working and no need to register IHttpContextAccessor.

I think I have found the issue,
There was an breaking change, The IHttpContextAccessor service is not registered by default anymore. (See announcement)
So add in your startup.cs:
public void ConfigureServices(IServiceCollection Services)
{
//call this in case you need aspnet-user-authtype/aspnet-user-identity
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

I found this question while searching for "asp.net core nlog username". Eventually I found the solution and I am logging it here for posterity.
Problem
How do I include the currently logged in user's username in my NLog log messages?
Solution
I am using NLog inside of my ASP.NET Core web app. I tried using the ${aspnet-user-identity} layout renderer, but determined that the value was empty because we were using custom authentication.
After doing some digging, I figured out that I could access values stored as a ASP.NET Session variable from NLog. So, after I authenticated the user, I stuffed their username into a session variable and voila!
Here is the code I call after authenticating the user:
// Store username in session so we can access it from NLog logs.
httpContext.Session.SetString("NlogUser", contact.Username);
Here is what the layout renderer line in the nlog.config looks like
<parameter name="#identity" layout="${aspnet-session:variable=NlogUser}"/>
Here is the corresponding NLog documenation for the AspNetSession layout renderer.

If you recently upgraded ASP.NET Core you may have to configure NLog differently in program.cs:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.CaptureStartupErrors(true)
.UseIISIntegration()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.ConfigureLogging((hostingContext, logging) =>
{
//logging.AddNLog(); //<--- Can remove (NLog.Extensions.Logging)
})
;
})
.UseNLog(); // <--- Call UseNLog off of IHostBuilder (NLog.Web)
}
see https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3

Related

500 Error when setting up Swagger in asp .net CORE / MVC 6 app

I'm trying to setup a basic swagger API doc in a new asp .net CORE / MVC 6 project and receiving a 500 error from the swagger UI:
500 : http://localhost:4405/swagger/v1/swagger.json
My startup class has the following code in it:
using Swashbuckle.SwaggerGen;
using Swashbuckle.SwaggerGen.XmlComments;
using Swashbuckle.Application;
....
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSwaggerGen();
services.ConfigureSwaggerDocument(options =>
{
options.SingleApiVersion(new Info
{
Version = "v1",
Title = "Blog Test Api",
Description = "A test API for this blogpost"
});
});
}
and then under Configure:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
....
app.UseSwaggerGen();
app.UseSwaggerUi();
....
}
When i build and run the project, the UI will come up when i go to swagger/UI/index.html, but the 500 error above is displayed. When i go to the swagger/v1/swagger.json link, console gives the following 500 error:
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
Is there any way i can figure out the root cause of the 500 or enable any additional debug in swagger to figure out why it's throwing this error? Based on some of the tutorials i've looked at, only what i have in startup is required for a base implementation. Please let me know if i can provide any additional information.
EDIT: this is for rc1, and may not be relevant to the new netcore 1.0 currently out (6/29/2016)
If someone want to know the exact error is in the Swagger's stack trace, request the URL:
<your-app-url>/swagger/v1/swagger.json
Or, click on the swagger.json link from the browser dev tools console:
Which will show the error in your IDE Output:
Initially I got a 500 error too. Deep down in the stacktrace it said:
System.NotSupportedException: Unbounded HTTP verbs for path 'api/hotels'. Are you missing an HttpMethodAttribute?
It turned out I was missing a HttpGet attribute for one of my api methods:
[Microsoft.AspNetCore.Mvc.HttpGet]
also if you used a method with a parameter like this "Get(int id)"
you will get the same error without an explanation so you need to add it into the decoration
"[HttpGet("{id:int}")]"
I got this error when one of my functions was marked as public, but wasn't meant to be a web service which could be called directly.
Changing the function to private made the error go away.
Alternatively, immediately before your public function, you can put the [NonAction] command, to tell Swagger to ignore it.
[NonAction]
public async Task<IActionResult> SomeEvent(string id)
{
...
}
(I wish Swagger would actually report the name of the function which caused this problem though, rather than just complaining that it could no longer find the "../swagger/v1/swagger.json" file... that's not particularly useful.)
Firstly you can enable the developer exception page by adding app.UseDeveloperExceptionPage(); on your Configure() in order to see better which is the root cause. Take a look here
In my case the problem was that I have to install also Microsoft.AspNetCore.StaticFiles nuget in order to make Swagger work.
Try also to uninstall/reinstall Swashbuckle.AspNetCore nuget.
I had this problem today and the cause was that some methods on my controllers API was missing [HttpGet]:
The exception (in stack trace) showed me the problme
You can also check the exception in the Output window in Visual Studio like this (in my case it showed me):
Look here if you're not able to load the and look at the swagger.json in the console.
Swagger has a difficult time negotiating the differences between namespaces. When building the objects expected for api calls it will index through each defined class. If there are two classes that share a class name it won't be able to process the swagger.json file.
Example of two classes that .Net will process correctly, but Swagger will not.
namespace MyCompany.PaymentProcessor.DTO
{
public class Payment
{
//dto content
}
}
and
namespace MyCompany.CbData
{
public class Payment
{
//couch base data
}
}
Will be treated correctly by .Net, but unresolvable by swagger.
In my case I was missing an action in route attribute which exist in your API controller.
Something like this:
[Route("api/[controller]/[action]")]
Before I had:
[Route("api/[controller]")]
An error occoures when writing [Route("api/[controller]")] because swagger doesn't know how to separate the API methods without action inside your route attribute.
Had the same problem and the error message helped me identify the root cause:
{
"error": "Conflicting method/path combination \"POST api/calls\" for actions - SMSApi_v2.Controllers.CallController.CreateCall (SMSApi_v2),SMSApi_v2.Controllers.CallController.CreateCalls (SMSApi_v2). Actions require a unique method/path combination for Swagger/OpenAPI 3.0. Use ConflictingActionsResolver as a workaround"
}
The root were these lines of code:
**[HttpPost("calls")]**
public IActionResult CreateCall([FromBody]Call call)
{
repository.Create(call);
return Ok(call);
}
**[HttpPost("calls")]**
public IActionResult CreateCalls([FromBody] string xmlFile)
{
var calls = xmlProcessor.DeserializeTo<List<Call>>(xmlFile);
if (!calls.Any())
return BadRequest("Deserializing was not done correctly.");
repository.Create(calls);
return Ok(calls);
}
Even if the signatures of the methods are different, the two API verbs have the same route and this is generating the error.
Add [HttpGet] or [HttpPost] on top of api actions.
Add [Reout("YourApiActionName")] on top of api actions ,
or add [Route("[controller]/[action]")] on top of your Controller class.
Also if I may add, the swagger set up does not like it when you route at the root level of your controllers. For example:
Do not do this:
[Produces("application/json")]
[Route("/v1/myController")]
[Authorize]
public class myController
{
[SwaggerResponse((int)System.Net.HttpStatusCode.OK, Type = typeof(RestOkResponse<Response>))]
[SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.Forbidden, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
[HttpPost]
[Authorize()]
public async Task<IActionResult> Create([FromBody] MyObject myObject)
{
return Ok();
}
}
Do this:
[Produces("application/json")]
[Authorize]
public class myController
{
[SwaggerResponse((int)System.Net.HttpStatusCode.OK, Type = typeof(RestOkResponse<Response>))]
[SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.Forbidden, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
[HttpPost("/v1/myController")]
[Authorize()]
public async Task<IActionResult> Create([FromBody] MyObject myObject)
{
return Ok();
}
}
It took me a while to figure that the reason why I was getting internal server error was because of this routing issue. Hope this helps someone!
Might be obvious but, besides missing the HttpGet or HttpPost attributes, don't forget to differentiate the post methods.
You may have 2 different methods (with different names) marked with HttpPost, and that would also cause this kind of issue. Remember to specify the method name in the attribute: [HttpPost("update")].
I get same error in ASP.NET Boilerplate. I searched a lot and found a problem with my code. I use same name two DTO object, but located different namespaces.
For example first DTO object is like as below:
namespaces Test{
public class TestDto
{
public int Id{get;set;}
}
}
And second DTO object is like as below:
namespaces Test_2{
public class TestDto
{
public int Id{get;set;}
}
}
I changed Test_2.TestDto's name, problem did solve for me after.
In my case, a model has the same name as another model, I fixed changing the name
When I Add the parameter Version , it works
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});
Also had this problem. In my case, it was caused by two endpoints in the same controller with the same route and method name (but different parameter types). Of course, it then became apparent that that was probably poor practice anyway so I changed the endpoint names and all was well.
in some cases, the router of controller is duplicated. Review the last controller modified.
I was getting this error because in STARTUP.CS I not put the version's name in SwaggerDoc parameters:
Error => c.SwaggerDoc("", blablabla
WORK => c.SwaggerDoc("v1",blablabla
then, now are ok fine!
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info {Title = "PME SERVICES", Version = "v1"});
});
I ran into this issue today configuring Swagger in a .Net Core 2.2 Web Api project. I started down the path that #Popa Andrei mentions above by including the Microsoft.AspNetCore.StaticFiles dependency in my project as I figured that was most likely the culprit. That turned into a rabbit hole of chaining dependencies although it did ultimately work for me.
I then realized that in my ConfigureServices method in Startup I had services.AddMvcCore(...) which just gives you bare bones and you add dependencies as you need them. When I changed that to services.AddMvc(...) it started working without having to manually add all the dependencies required by Microsoft.AspNetCore.StaticFiles.
That doesn't mean you can't take the route of staying with services.AddMvcCore(...) and then adding all the necessary dependencies. You can, and it will work.
It is just much easier to take the services.AddMvc(...) approach and be done.
Hope that helps someone.
Making sure my swagger versions lined up with each other fixed my issue. Since I was starting a new project I set my api version to be v0.1
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v0.1", new Info { Title = "Tinroll API", Version = "v0.1" });
});
But had left my swagger url to be v1.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Tinroll API v0.1");
c.RoutePrefix = string.Empty;
});
I updated my versioning to be /swagger/v0.1/swagger.json instead of v1 and Swagger worked as expected.
Since I don't see the solution which worked for me posted here, I will contribute one to the ongoing thread. In my case, it was the Route attribute was set separately with the HttpPost/HttpGet at the function level (not controller level).
INCORRECT:
[HttpPost]
[Route("RequestItem/{itemId}")]
CORRECT:
[HttpPost("RequestItem/{itemId}")]
Also, the Swagger seems to expect Ok(object) result instead of StatusCode(object) result for a success request to return.
For me it was because of having two class types with the same name but with different namespaces, which are used as the return type of two different actions in different controllers!
When I changed the name of one of them, the problem solved!
For me the problem was due to OData. If I just commented out my services.AddOData(); I didn't get any error.just comment out the services.AddOData();
If you use Swagger, which is enabled by default in .Net Core 5, it needs to know something about your methods. Normally, you don't need to add [HttpGet] attribute because it is the default HttpMethod for your methods, but swagger requires that information to generate documentation of your code.
So adding [HttpGet] above my method solved my issue.
Might you've missed adding API verb to an endpoint. Can use below header as your need
1.[Microsoft.AspNetCore.Mvc.HttpGet]
2.[Microsoft.AspNetCore.Mvc.HttpPost]
This came because you have a no-action method on your controller class check that missed an HTTP attribute on any of the controller action methods. If you need a no-action or no need for access from external methods declaration then make it private, you will fix this issue.
private void MyMethod()
{
}
Give a look at this project.
https://github.com/domaindrivendev/Ahoy/tree/master/test/WebSites/Basic
This repo is from Swashbuckle´s owner, is a basic ASP.NET 5 Sample app, this is help you to correct configure yours middlewares (and take care about the orders of them, it´s matter, e.g., use "app.UseSwaggerGen();app.UseSwaggerUi(); after app.UseMvc();)
To enable logging in your applcation give a look at:
https://docs.asp.net/en/latest/fundamentals/logging.html?highlight=logging
(the log will be generated inside "wwwroot" folder
To see the source of exception
open chrome browser
open developer tools
see exceptions in console tab
fix it.
The setup for Swagger is varying greatly from version to version. This answer is for Swashbuckle 6.0.0-beta9 and Asp.Net Core 1.0. Inside of the ConfigureServices method of Startup.cs, you need to add -
services.AddSwaggerGen(c =>
{
c.SingleApiVersion(new Info
{
Version = "v1",
Title = "My Awesome Api",
Description = "A sample API for prototyping.",
TermsOfService = "Some terms ..."
});
});
Then in the Configure method you must add -
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseMvc();
app.UseSwaggerGen();
app.UseSwaggerUi();
}
Be sure you are referencing in Startup.cs -
using Swashbuckle.SwaggerGen.Generator;
My project.json file looks like -
"dependencies": {
"Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-final",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0-rc2-final",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-*",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
"Microsoft.Extensions.Logging": "1.0.0-rc2-final",
"Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final",
"Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final",
"Swashbuckle": "6.0.0-beta9"
},
"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": {
"version": "1.0.0-preview1-final",
"imports": "portable-net45+win8+dnxcore50"
},
"Microsoft.EntityFrameworkCore.Tools": {
"version": "1.0.0-preview1-final",
"imports": [
"portable-net45+win8+dnxcore50",
"portable-net45+win8"
]
}
},
"frameworks": {
"net452": { }
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true,
"xmlDoc": false
},
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings.json",
"web.config"
]
},
"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}

aspnet identity; how to login using a legacy password?

i've a site i'm updating to web api with aspnet identity 2.0.
It's a legacy site for which we need to allow the users to use their old passwords; at least during a reasonable migration period
following this article, i've derived a new UserManager from the base UserManager, and set up the PasswordHasher to hash with an old SHA1 algorithm.
My passwordHasher looks like this:
public class SQLPasswordHasher : PasswordHasher
{
public override string HashPassword(string password)
{
string cipherText = EncryptPassword(password);
return cipherText;
}
public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
{
string cipherText = EncryptPassword(providedPassword);
if (cipherText == hashedPassword)
{
return PasswordVerificationResult.SuccessRehashNeeded;
}
else
{
return PasswordVerificationResult.Failed;
}
}
private string EncryptPassword(string plainText)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(plainText, "sha1");
}
}
When i register users with this code, I can see the passwords are being hashed and persisted in the database correctly... for the password 'foobar', the hashed value is fixed and recognizable, since this algorithm did not use a salt.
However, I cannot log in as these users. If i set a breakpoint in the new hasher, it never gets it. Neither can i seem to hit a breakpoint anywhere in the account controller when trying to log in.
thanks in advance
I'm answering my own question, in the hopes that someone else may benefit.
The problem was, i couldn't find what in the web api service was being called when logging in. I finally realized that something called /Token was being set up as the url to be called in the app.js javascript.
Searching through the project server side sources and googling led me to this article, which pointed me to the ApplicationOAuthProvider.cs file, in the 'Providers' folder of the template application.
The specific line of interest is where the method GrantResourceOwnerCredentials instantiates it's own user manager, thus:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
From there, all i had to do was add this line:
userManager.PasswordHasher = new SQLPasswordHasher();
and i could finally log in.

Sitecore 7: "Clear on Index Update" not working?

Refer to this post for a description of the feature.
My HTML cache is enabled, and I have turned on "Clear on Index Update" for one of my Renderings.
However, the entry for my Rendering is NOT marked with any special token in the cache - I verified the cache content before and after using the rendering. This, of course, leads to the Clear() method in Sitecore.ContentSearch.Maintenance.IndexDependentHtmlCacheManager to not pick it up, making this feature useless.
I am on Sitecore 7.2 - is this a known bug?
You can override GenerateCacheKey processor (or add your own processor after that one) and update the key to include _#index.
Code below is for MVC. As #jammykam says, in WebForms key is added to cacheKey OOTB.
public class GenerateCustomCacheKey : GenerateCacheKey
{
protected override string GenerateKey(Rendering rendering, RenderRenderingArgs args)
{
Item renderingItem = rendering.RenderingItem.InnerItem;
var key = base.GenerateKey(rendering, args);
if (renderingItem["ClearOnIndexUpdate"].ToBool())
key += "_#index";
return key;
}
}
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<mvc.renderRendering>
<processor
type="My.Assembly.Namespace.GenerateCustomCacheKey, My.Assembly"
patch:instead="*[#type='Sitecore.Mvc.Pipelines.Response.RenderRendering.GenerateCacheKey, Sitecore.Mvc']" />
</mvc.renderRendering>
</pipelines>
</sitecore>
</configuration>
Ok, it turns out that this features is currently bugged on MVC, at least as of 16th of March 2015:
http://www.tarasalenin.com/caching-sitecore-mvc-renderings/
That's about it. There are workarounds, but in the meanwhile I sorted my problem in a different way. Posting this in case someone else happens to have the same problem.

Using Specflow and Watin - have set the STA-thread, still get a System.Threading.ThreadStateException

I'm writing UI-tests with Specflow and Watin.
I have done the following to ensure Watin to work
Setting the Thread.ApartmentState in the App.config
<configuration>
<configSections>
<section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
<sectionGroup name="NUnit">
<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</configSections>
<NUnit>
<TestRunner>
<!-- Valid values are STA,MTA. Others ignored. -->
<add key="ApartmentState" value="STA" />
</TestRunner>
</NUnit>
</configuration>
In the Properties for InteropSHDocVw I've set the "Embeded Interop Types" to False and the "Copy Local" to True
My code looks like this...
code in () is because I'm not allowed to share credentials and urls to this site
The specflow feature
Feature: Company
In order to earn money
As a company
I want the suer to be able to shop our products
Scenario: Log In
Given I have navigated to (a companys test website)
And I have entered (a username) and (a password) as credentials
When I press Log in
Then then I should have the (permissions)
The teststeps written in Watin
using NUnit.Framework;
using System;
using TechTalk.SpecFlow;
using WatiN.Core;
namespace Projectname.Companyname.Specs
{
[Binding]
[RequiresSTA]
public class CompanySteps
{
IE browser = new IE();
[Given]
public void Given_I_have_navigated_to_URL(string url)
{
browser.GoTo(url);
}
[Given]
public void Given_I_have_entered_EMAIL_and_PASSWORD_as_credentials(string email, string password)
{
browser.TextField(Find.ByName("UserName")).TypeText(email);
browser.TextField(Find.ByText("Password")).TypeText(password);
}
[When]
public void When_I_press_Log_in()
{
browser.Button(Find.ByText("Log in »")).Click();
}
[Then]
public void Then_then_I_should_have_the_PERMISSION_permission(string permission)
{
browser.GoTo("the page where the permissions is showing as plain text");
Assert.IsTrue(browser.ContainsText(permission));
}
}
Now, my probelm, I've done all the things mentioned online to fix the STA or the Interop exceptions, but now when I run my Specflow/Watin test, I still get this exception for the STA thread:
System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> System.Threading.ThreadStateException : The CurrentThread needs to have it's ApartmentState set to ApartmentState.STA to be able to automate Internet Explorer.
Anyone who have had the same problem and has a solution? Have I forgotten any Code parts? is the syntax wrong somewhere?
Kindest regards and thanks in advance for your help.

Fluent NHibernate - how to configure for oracle?

Almost certainly a stupid question but I can't find the answer anywhere.
In the Getting Started tutorial the database is SQLite and so his session factory creation
is done using the SQLiteConfiguration class in the FluentNHibernate.Cfg.Db namespace
Great! But I don't see a Configuration class for using an Oracle database. How do I do this?
Cross-posted to the fluent NH mailing list (with answer)
This works for me. Hope this helps!
private static ISessionFactory CreateSessionFactory()
{
var cfg = OracleClientConfiguration.Oracle9
.ConnectionString(c =>
c.Is("DATA SOURCE=<<NAME>>;PERSIST SECURITY INFO=True;USER ID=<<USER_NAME>>;Password=<<PASSWORD>>"));
return Fluently.Configure()
.Database(cfg)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<CLASS_NAME>().ExportTo(#".\"))
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
private static void BuildSchema(NHibernate.Cfg.Configuration config)
{
// this NHibernate tool takes a configuration (with mapping info in)
// and exports a database schema from it
new SchemaExport(config)
.Create(false, true);
}
Does this helps you?
http://tiredblogger.wordpress.com/2008/12/04/persistanceconfiguration-for-oraclefluent-nhibernate/
Edit: The code mentioned uses the ConnectionStringExpression class which no longer exists in Fluent NHibernate. However, that class isn't used for anything other than holding the OracleConfiguration _config field. You can safely, add the field to the OracleConnectionStringExpression class and remove it.
The remaining issue is that NHibernate will now for some reason look for components that are not in the current build of Oracle.DataAccess. If you want to deal with that you can do what tiredblogger did here.

Resources