我如何使用PetaPoco独立的仅限模型项目?

时间:2012-03-23 20:34:30

标签: c# models petapoco

我目前在一个解决方案中有以下内容:

  1. 核心项目(数据访问,商业逻辑,用于数据访问的petapoco,管道等)
  2. 模型项目(只是属性的模型和petapoco装饰)
  3. Web项目(用于演示的MVC项目
  4. 我希望我的模型和Core分开,但我不能在两个地方都有PetaPoco.cs。我如何分离它仍然能够用PetaPoco属性装饰我的Models项目中的POCO?

    我不希望Models项目依赖于Core项目。

    我确实创建了这个单独的类只在Models项目中,所以我可以装饰POCO,但是Core PetaPoco项目没有正确地拾取属性。它过分依赖PocoData。

    建议?

    // Poco's marked [Explicit] require all column properties to be marked
    [AttributeUsage(AttributeTargets.Class)]
    public class ExplicitColumnsAttribute : Attribute
    {
    }
    // For non-explicit pocos, causes a property to be ignored
    [AttributeUsage(AttributeTargets.Property)]
    public class IgnoreAttribute : Attribute
    {
    }
    
    // For explicit pocos, marks property as a column and optionally supplies column name
    [AttributeUsage(AttributeTargets.Property)]
    public class ColumnAttribute : Attribute
    {
        public ColumnAttribute() { }
        public ColumnAttribute(string name) { Name = name; }
        public string Name { get; set; }
    }
    
    // For explicit pocos, marks property as a result column and optionally supplies column name
    [AttributeUsage(AttributeTargets.Property)]
    public class ResultColumnAttribute : ColumnAttribute
    {
        public ResultColumnAttribute() { }
        public ResultColumnAttribute(string name) : base(name) { }
    }
    
    // Specify the table name of a poco
    [AttributeUsage(AttributeTargets.Class)]
    public class TableNameAttribute : Attribute
    {
        public TableNameAttribute(string tableName)
        {
            Value = tableName;
        }
        public string Value { get; private set; }
    }
    
    // Specific the primary key of a poco class (and optional sequence name for Oracle)
    [AttributeUsage(AttributeTargets.Class)]
    public class PrimaryKeyAttribute : Attribute
    {
        public PrimaryKeyAttribute(string primaryKey)
        {
            Value = primaryKey;
            autoIncrement = true;
        }
    
        public string Value { get; private set; }
        public string sequenceName { get; set; }
        public bool autoIncrement { get; set; }
    }
    
    [AttributeUsage(AttributeTargets.Property)]
    public class AutoJoinAttribute : Attribute
    {
        public AutoJoinAttribute() { }
    }
    

1 个答案:

答案 0 :(得分:0)

我认为一个明显的解决方案,我不确定它会好得多,就是将PetaPoco移动到自己的项目中,然后在Core和Models项目中引用它。但是,您的模型仍然具有外部依赖性,而不是整个Core程序集。

另一种替代方法是将您的装饰模型放在Core项目中供内部使用,然后在Models程序集中包含一组未修饰的类。您可以使用自动映射组件轻松地在两者之间进行映射。所以基本上你会使用PetaPoco将数据提取到你的内部模型中,然后将它映射到你的'外部'模型,这只是没有依赖的裸类。

当然,这听起来像是额外的工作。我想这一切都取决于你的模型程序集没有其他依赖关系是多么重要。