|
From: <fab...@us...> - 2010-08-07 16:51:56
|
Revision: 5124
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5124&view=rev
Author: fabiomaulo
Date: 2010-08-07 16:51:50 +0000 (Sat, 07 Aug 2010)
Log Message:
-----------
Fix NH-2266
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Domain.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Mappings.hbm.xml
Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs 2010-08-07 12:58:27 UTC (rev 5123)
+++ trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs 2010-08-07 16:51:50 UTC (rev 5124)
@@ -527,6 +527,12 @@
private string DiscriminatorFilterFragment(string alias)
{
+ const string abstractClassWithNoSubclassExceptionMessageTemplate =
+@"The class {0} can't be instatiated and does not have mapped subclasses;
+possible solutions:
+- don't map the abstract class
+- map the its subclasses.";
+
if (NeedsDiscriminator)
{
InFragment frag = new InFragment();
@@ -541,13 +547,20 @@
}
string[] subclasses = SubclassClosure;
- for (int i = 0; i < subclasses.Length; i++)
+ int validValuesForInFragment = 0;
+ foreach (string t in subclasses)
{
- IQueryable queryable = (IQueryable)Factory.GetEntityPersister(subclasses[i]);
+ var queryable = (IQueryable) Factory.GetEntityPersister(t);
if (!queryable.IsAbstract)
+ {
frag.AddValue(queryable.DiscriminatorSQLValue);
+ validValuesForInFragment++;
+ }
}
-
+ if(validValuesForInFragment == 0)
+ {
+ throw new NotSupportedException(string.Format(abstractClassWithNoSubclassExceptionMessageTemplate, subclasses[0]));
+ }
StringBuilder buf = new StringBuilder(50).Append(" and ").Append(frag.ToFragmentString().ToString());
return buf.ToString();
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Domain.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Domain.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Domain.cs 2010-08-07 16:51:50 UTC (rev 5124)
@@ -0,0 +1,10 @@
+using System;
+
+namespace NHibernate.Test.NHSpecificTest.NH2266
+{
+ public abstract class Token { public virtual int Id { get; set; } }
+
+ public class SecurityToken : Token { public virtual string Owner { get; set; } }
+
+ public abstract class TemporaryToken : Token { public virtual DateTime ExpiryDate { get; set; } }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Fixture.cs 2010-08-07 16:51:50 UTC (rev 5124)
@@ -0,0 +1,19 @@
+using System;
+using NHibernate.Cfg;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.NHSpecificTest.NH2266
+{
+ public class Fixture
+ {
+ [Test]
+ public void WhenBuildSessionFactoryThenThrows()
+ {
+ Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration();
+ cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2266.Mappings.hbm.xml", GetType().Assembly);
+ cfg.Executing(c => c.BuildSessionFactory()).Throws<NotSupportedException>()
+ .And.ValueOf.Message.Should().Contain("does not have mapped subclasses").And.Contain(typeof(TemporaryToken).FullName);
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2266/Mappings.hbm.xml 2010-08-07 16:51:50 UTC (rev 5124)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.NHSpecificTest.NH2266">
+
+ <class name="Token" abstract="true">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ <discriminator/>
+ <subclass name="SecurityToken">
+ <property name="Owner"/>
+ </subclass>
+ <subclass name="TemporaryToken" abstract="true">
+ <property name="ExpiryDate"/>
+ </subclass>
+ </class>
+</hibernate-mapping>
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-07 12:58:27 UTC (rev 5123)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-07 16:51:50 UTC (rev 5124)
@@ -454,6 +454,8 @@
<Compile Include="NHSpecificTest\NH2148\Domain.cs" />
<Compile Include="NHSpecificTest\NH2245\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2245\Model.cs" />
+ <Compile Include="NHSpecificTest\NH2266\Domain.cs" />
+ <Compile Include="NHSpecificTest\NH2266\Fixture.cs" />
<Compile Include="TypesTest\CharClass.cs" />
<Compile Include="TypesTest\CharClassFixture.cs" />
<Compile Include="TypesTest\DateTimeClass.cs" />
@@ -2240,6 +2242,7 @@
<EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" />
<EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="NHSpecificTest\NH2266\Mappings.hbm.xml" />
<EmbeddedResource Include="TypesTest\CharClass.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1836\Mappings.hbm.xml" />
<EmbeddedResource Include="TypesTest\DateTimeClass.hbm.xml" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|