Thomas Atwood created CASSANDRA-7996: ----------------------------------------
Summary: Cassandra C# driver errors on virtual properties when using CreateIfNotExists method Key: CASSANDRA-7996 URL: https://issues.apache.org/jira/browse/CASSANDRA-7996 Project: Cassandra Issue Type: Improvement Components: Drivers (now out of tree) Reporter: Thomas Atwood Fix For: 2.1.0 When using the Cassandra C# driver, I receive the error "An unhandled exception of type 'Cassandra.SyntxError' occurred in Cassandra.dll when attempting to create a table with an overridden property using the Linq functionality with the driver. If the property is not overriden, the driver creates the table without any issues. Example: concrete object inherits from abstract object where the Id field is virtual on the abstract object. Reason to override this field would be to apply certain regex validation for format depending on the derived concrete object (Id will still be unique across all objects that inherit from the abstract object). Abstract object: using System; using System.ComponentModel; using Cassandra.Data.Linq; namespace TestDatastaxCsDriver.Abstract { [AllowFiltering] [Serializable] public class AbstractEntity: INotifyPropertyChanged { private string _id; private string _name; private string _insertuser; private DateTime _insertimestamp; private DateTime _modifiedtimestamp; public event PropertyChangedEventHandler PropertyChanged; public AbstractEntity(string id, string name, string insertuser) { Id = _id; Name = _name; InsertUser = _insertuser; InsertTimestamp = DateTime.Now; ModifiedTimestamp = DateTime.Now; } [PartitionKey] [Column("id")] public virtual string Id { get { return _id; } set { if (value != _id) { _id = value; NotifyPropertyChanged("Id"); } } } [Column("name")] public string Name { get { return _name; } set { if (value != _name) { _name = value; NotifyPropertyChanged("Name"); } } } [Column("insertuser")] public string InsertUser { get { return _insertuser; } set { if (value != _insertuser) { _insertuser = value; NotifyPropertyChanged("InsertUser"); } } } [Column("inserttimestamp")] public DateTime InsertTimestamp { get { return _insertimestamp; } set { if (value != _insertimestamp) { _insertimestamp = value; NotifyPropertyChanged("InsertTimestamp"); } } } [Column("modifiedtimestamp")] public DateTime ModifiedTimestamp { get { return _modifiedtimestamp; } set { if (value != _modifiedtimestamp) { _modifiedtimestamp = value; NotifyPropertyChanged("ModifiedTimestamp"); } } } private void NotifyPropertyChanged(String propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); ModifiedTimestamp = DateTime.Now; } } } } Concrete object: using System.ComponentModel.DataAnnotations; using Cassandra.Data.Linq; using TestDatastaxCsDriver.Abstract; namespace TestDatastaxCsDriver.Concrete { [Table("issuer")] public class Issuer : AbstractEntity { public Issuer(string id, string name, string insertuser) : base(id, name, insertuser) { } //Cassandra C# driver chokes on this. No issues if the property is not overriden. Please note I also tried adding a column attribute to see if it fixed the problem and it did not. [MaxLength(3,ErrorMessage = "Id cannot be longer than 3 characters.")] public override string Id { get { return base.Id; } set { base.Id = value; } } } } Program.cs to test: using Cassandra; using Cassandra.Data.Linq; using TestDatastaxCsDriver.Concrete; namespace TestDatastaxCsDriver { class Program { static void Main(string[] args) { Cluster cluster = Cluster.Builder().AddContactPoint("127.0.0.1").WithCredentials("cassandra", "cassandra").Build(); var session = cluster.Connect(); session.CreateKeyspaceIfNotExists("test"); session.ChangeKeyspace("test"); var issuer = session.GetTable<Issuer>(); issuer.CreateIfNotExists(); } } } The request would be to allow for the CreateIfNotExists method to ignore the override keyword and to create the property with the type specified as long as the type is one of the types supported by the driver (e.g. string, int, bool, etc.). Please let me know if you need more sample code or additional clarification regarding this request. -- This message was sent by Atlassian JIRA (v6.3.4#6332)