c# – Fluent NHibernate – 添加鉴别器的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Fluent NHibernate – 添加鉴别器的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4499字,纯文字阅读大概需要7分钟。
内容图文
![c# – Fluent NHibernate – 添加鉴别器的问题](/upload/InfoBanner/zyjiaocheng/790/2a1447283fd7450db6b5378408993b12.jpg)
我有一个类,Document和几个子类(Invoice,PurchaseOrder等).我已经为Document添加了一个鉴别器,如下所示:
public class DocumentMapOverride : IAutoMappingOverride<Document>
{
public void Override(AutoMapping<Document> mapping)
{
mapping.DiscriminateSubClassesOnColumn("DocumentType");
}
}
我的理解是,如果我创建一个Invoice,它会将类型名称插入DocumentType列.但是,当我尝试插入Invoice时,我得到以下异常.
NHibernate.Exceptions.GenericADOException : could not insert: [MyNamespace.Invoice#101][SQL: INSERT INTO "Document" (Version, DocumentNumber, DocumentDate, DbDate, Sender_id, Receiver_id, SenderAlias_id, ReceiverAlias_id, Process_id, Id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
----> System.Data.SQLite.SQLiteException : Abort due to constraint violation
Document.DocumentType may not be NULL
有什么建议?
> FluentNHibernate 1.0
> SQLite
> C#/ .Net4.0
解决方法:
我无法重现这个问题.我已经下载了最新版本的FluentNHibernate 1.1 from here,以下程序运行正常:
using System;
using System.Reflection;
using FluentNHibernate;
using FluentNHibernate.Automapping;
using FluentNHibernate.Automapping.Alterations;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using FluentNHibernate.Conventions;
using FluentNHibernate.Conventions.Instances;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
public interface IEntity
{
int Id { get; set; }
}
public abstract class MyBaseClass : IEntity
{
public virtual int Id { get; set; }
public class MyBaseClassMap : IAutoMappingOverride<MyBaseClass>
{
public void Override(AutoMapping<MyBaseClass> mapping)
{
mapping.DiscriminateSubClassesOnColumn("ChildClassType", "MyBaseClassMap");
}
}
}
public class MyFirstChildClass : MyBaseClass
{
public virtual string Child1 { get; set; }
}
public class MySecondChildClass : MyBaseClass
{
public virtual string Child2 { get; set; }
}
public class PrimaryKeyConvention : IIdConvention
{
public void Apply(IIdentityInstance instance)
{
string table = string.Format("{0}_HiLo", instance.EntityType.Name);
instance.GeneratedBy.HiLo(table, "next_hi", "100");
}
}
public class MyMappingConfig : DefaultAutomappingConfiguration
{
public override bool ShouldMap(Type type)
{
if (type.GetInterface(typeof(IEntity).FullName) != null)
return true;
return false;
}
public override bool AbstractClassIsLayerSupertype(Type type)
{
if (type == typeof(IEntity))
return true;
return false;
}
public override bool IsId(Member member)
{
return member.Name == "Id";
}
public override bool IsDiscriminated(Type type)
{
if (type.IsAssignableFrom(typeof(MyBaseClass)) || type.IsSubclassOf(typeof(MyBaseClass)))
return true;
return false;
}
}
public class Program
{
private static ISession InitializeNHibertnat(Assembly mapAssembly)
{
var automappingConfiguration = new MyMappingConfig();
var fluentConfiguration =
Fluently.Configure().Database(SQLiteConfiguration.Standard.InMemory());
fluentConfiguration = fluentConfiguration
.Mappings(m => m.AutoMappings
.Add(AutoMap.Assembly(mapAssembly, automappingConfiguration)
.Conventions.Add<PrimaryKeyConvention>()
.UseOverridesFromAssembly(mapAssembly)))
.Mappings(m => m.FluentMappings
.AddFromAssembly(mapAssembly))
.Mappings(m => m.HbmMappings
.AddFromAssembly(mapAssembly))
.ExposeConfiguration(cfg => cfg.SetProperty("generate_statistics", "true"))
.ExposeConfiguration(cfg => cfg.SetProperty("show_sql", "true"))
.ExposeConfiguration(cfg => cfg.SetProperty("adonet.batch_size", "1"));
var configuration = fluentConfiguration.BuildConfiguration();
var sessionFactory = configuration.BuildSessionFactory();
var session = sessionFactory.OpenSession();
new SchemaExport(configuration).Execute(false, true, false, session.Connection, null);
return session;
}
static void Main()
{
var mfcc = new MyFirstChildClass();
mfcc.Id = 1;
mfcc.Child1 = "Child One";
var mscc = new MySecondChildClass();
mscc.Id = 2;
mscc.Child2 = "Child Two";
var Session = InitializeNHibertnat(Assembly.GetExecutingAssembly());
using (var tx = Session.BeginTransaction())
{
Session.Save(mfcc);
Session.Save(mscc);
tx.Commit();
}
}
}
这是执行的SQL查询:
NHibernate: select next_hi from MyBaseClass_HiLo
NHibernate: update MyBaseClass_HiLo set next_hi = @p0 where next_hi = @p1;@p0 = 2, @p1 = 1
NHibernate: INSERT INTO "MyBaseClass" (Child1, ChildClassType, Id) VALUES (@p0, 'MyFirstChildClass', @p1);@p0 = 'Child One', @p1 = 101
NHibernate: INSERT INTO "MyBaseClass" (Child2, ChildClassType, Id) VALUES (@p0, 'MySecondChildClass', @p1);@p0 = 'Child Two', @p1 = 102
在我的测试中,我还使用了System.Data.SQLite,Version = 1.0.65.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139以及针对此控制台应用程序的.NET 4.0.在Windows 7 x64上运行它.
内容总结
以上是互联网集市为您收集整理的c# – Fluent NHibernate – 添加鉴别器的问题全部内容,希望文章能够帮你解决c# – Fluent NHibernate – 添加鉴别器的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。